在RLMArray上添加或更新对象?

时间:2016-05-24 21:28:09

标签: ios objective-c realm

我有一个内置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中。我应该检查餐厅是否在阵列中,如果没有,请添加它。但是我怎么能这样做呢?我怎样才能防止这种情况发生?

1 个答案:

答案 0 :(得分:2)

您可以通过调用+ [RLMObject objectForPrimaryKey:]并检查它是否已返回nil来检查具有指定主键的对象是否已存在。主键属性由Realm自动编入索引,因此可以非常快速地执行此查找。 :)

此外,为了澄清Realm的工作原理,我们不会检查该特定对象是否在您的RLMArray中;它是否对象位于Realm数据库本身。因此,在您的情况下,可能需要首先通过其主键查询该对象的Realm,如果结果不是nil,则检查该对象是否已在数组中。