2016-06-22 3 views
1

내 응용 프로그램의 채팅 부분에 사용자가 응용 프로그램을 열 때마다 대화 데이터를 장치에 유지하려고 시도 할 때 사용자가 새로 고칠 필요가 없습니다.다른 개체에 RLMObject 추가 RLMArray는 처음에만 작동합니다.

데이터베이스에서 모든 메시지를 가져온 후 배열을 반복하고 대화 모델 메시지 속성 (RLMArray)에 저장합니다.

각 메시지마다 기본 키가 있으므로 대화 메시지에 추가하기 전에 해당 메시지가 이미 있는지 확인하기 위해 영역을 확인합니다. 이것은 내가 응용 프로그램을 처음 사용할 때 잘 작동하지만 내가 다시 실행하면이 오류를 얻을 : 여기

'RLMException', reason: 'Can't set primary key property 'serverID' to existing value '1355'.' 

가 보면 영역

RLMRealm *realm = [RLMRealm defaultRealm]; 
     [realm beginWriteTransaction]; 
     for (Message *model in messageArray) { 
      NSLog(@"message model: %@", model); 
      TERMessage *message = [[TERMessage alloc] initWithMessage:model]; 
      TERMessage *existingObject = [self.model.messages objectsWhere:@"serverID == %@",message.serverID].firstObject; 
      NSLog(@"existing object: %@", existingObject); 
      if (existingObject == nil) { 
       [self.model.messages addObject:message]; 
      } else { 
       NSLog(@"not being aded"); 
      } 
     } 
     [realm commitWriteTransaction]; 

답변

2

에 메시지를 추가하려면 코드 당신의 코드에서 동일한 serverID을 가진 TERMessage 개체가 이미 self.model에 속하는지 쿼리합니다. 즉, 다른 TERMessage 개체가 아직 self.model에 연결되어 있지 않을 수도 있지만 개체가 여전히 영역에 존재할 가능성이 있습니다 (즉, 영역 파일의 TERMessage 테이블에 있음). 그런 경우

,이 두 번째 TERMessage 객체를 생성하고 self.model에 추가하려는 다음 경우, 영역은 TERMessage 테이블에 추가하려고하고 동일한 기본 키가 이미 존재하는 또 다른 개체를 발견한다.

이 문제를 해결하려면 쿼리 로직을 좀 더 철저하게 만들어서 원본 개체를 올바르게 잡을 수 있도록해야합니다.

먼저 [RLMObject objectForPrimaryKey:]을 사용하여 기본 키가있는 개체가 이미 있는지 확인할 수 있습니다. 만약 그렇다면, 당신은 다음 self.model에 이미 속해 있는지 확인하기 위해 영역의 반비례 관계 기능을 사용할 수 있습니다 :이 작동

@interface TERMessage : RLMObject 
//... other properties 
@property (readonly) RLMLinkingObjects *models; 
@end 

// -- 

@implementation TERMessage 
+ (NSDictionary *)linkingObjectsProperties { 
    return @{ 
     @"models": [RLMPropertyDescriptor descriptorWithClass:Message.class propertyName:@"model"], 
    }; 
} 
@end 

// -- 

RLMRealm *realm = [RLMRealm defaultRealm]; 
[realm beginWriteTransaction]; 
for (Message *model in messageArray) { 
    NSLog(@"message model: %@", model); 

    // Check to see if an entry exists and it is a linked object of our model object 
    TERMEssage *previousMessage = [TERMessage objectForPrimaryKey:message.serverID]; 
    if (previousMessage != nil && [previousMessage.models indexOfObject:self.model] != NSNotFound) { 
     continue; 
    } 

    // If the object exists, but it's not assigned to the model, assign it 
    if ([previousMessage.models indexOfObject:self.model] == NSNotFound) { 
     [self.model.messages addObject:previousMessage]; 
     continue; 
    } 

    //Create and add a new message object 
    TERMessage *message = [[TERMessage alloc] initWithMessage:model]; 
    [self.model.messages addObject:message]; 
} 
[realm commitWriteTransaction]; 
+0

을! 속성은 프로젝트에서 다른 이름을 갖지만 프로세스가 작동합니다! 감사! –

관련 문제