我有一个内置Realm和CloudKit的应用程序。该应用程序从CloudKit容器中获取数据,然后将其添加到Realm。然而,两个中的一个具有一些链接的Realm模型,而这就是困难所在。
我目前的代码如下:
NSPredicate *predicate = [NSPredicate predicateWithValue:YES];
CKDatabase *publicDatabase = [[CKContainer containerWithIdentifier:@"iCloud.com.myname.myapp"] publicCloudDatabase];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"Restaurant" predicate:predicate];
CKQueryOperation *queryOp = [[CKQueryOperation alloc] initWithQuery:query];
queryOp.recordFetchedBlock = ^(CKRecord *record)
{
RLMRealm *realm = [RLMRealm defaultRealm];
Restaurant *restaurant = [[Restaurant alloc] init];
restaurant.name = record[@"Name"];
restaurant.explanation = record[@"Explanation"];
Table *firstTable = [[Table alloc] init];
firstTable.number = record[@"FirstNumber"];
[restaurant.tables addObject:firstTable];
Table *secondTable = [[Table alloc] init];
secondTable.number = record[@"SecondNumber"];
[restaurant.tables addObject:secondTable];
set.localID = [record[@"localID"] integerValue];
RLMResults<Area *> *areas = [Area objectsWhere:@"postalCode = 90210"];
Area *area = [areas objectAtIndex:0];
[realm beginWriteTransaction];
[area.restaurants addObject:restaurant];
[realm commitWriteTransaction];
};
queryOp.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error)
{
NSLog(@"Fetching succeeded");
success(@"test");
};
queryOp.resultsLimit = CKQueryOperationMaximumResults;
[publicDatabase addOperation:queryOp];
现在,这是我的代码的简化,但它重现了我得到的错误。领域抛出:Can't set primary key property 'localID' to existing value '26306'.
。我认为这是因为确切的Restaurant
已经在RLMArray
中。我应该检查餐厅是否在阵列中,如果没有,请添加它。但是我怎么能这样做呢?我怎样才能防止这种情况发生?
答案 0 :(得分:2)
您可以通过调用+ [RLMObject objectForPrimaryKey:]
并检查它是否已返回nil
来检查具有指定主键的对象是否已存在。主键属性由Realm自动编入索引,因此可以非常快速地执行此查找。 :)
此外,为了澄清Realm的工作原理,我们不会检查该特定对象是否在您的RLMArray
中;它是否对象位于Realm数据库本身。因此,在您的情况下,可能需要首先通过其主键查询该对象的Realm,如果结果不是nil
,则检查该对象是否已在数组中。