私はRealmとCloudKitが組み込まれたアプリを持っています。このアプリはCloudKitコンテナからデータを取り出し、それをRealmに追加します。 2回のフェッチの一つは、しかし、いくつかのリンクレルムモデルがあり、困難が来るところですRLMArrayにオブジェクトを追加または更新しますか?
私の現在のコードは次のようになります。
今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
に入っていることが原因であると私は信じています。私はおそらくレストランがアレイにあるかどうかをチェックし、そうでなければそれを追加するべきです。しかし、私はこれをどのようにすることができますか?これを防ぐ方法を教えてください。
今後Realmのユーザーにコメントを追加したいだけです。私はTiMは '[ objectForPrimaryKey:...]'を意味すると思います。私は文字通り '[RLMObject objectForPrimaryKey:...]'とタイプし、 "RLMObject"がRealmデータベースに永続化されていないというクラッシュを受けました:P –
Zhang
ええ、それは暗示されていました。解明してくれてありがとう! – TiM