2016-05-24 5 views
0

私は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に入っていることが原因であると私は信じています。私はおそらくレストランがアレイにあるかどうかをチェックし、そうでなければそれを追加するべきです。しかし、私はこれをどのようにすることができますか?これを防ぐ方法を教えてください。

答えて

2

+ [RLMObject objectForPrimaryKey:]を呼び出してnilを返さないことを確認することによって、指定された主キーを持つオブジェクトが既に存在するかどうかを確認できます。主キーのプロパティはRealmによって自動的に索引付けされるため、このルックアップは非常に迅速に実行されます。 :)

さらに、Realmの仕組みを明確にするために、特定のオブジェクトがあなたのRLMArrayにあるかどうかをチェックしていません。オブジェクトがレルムデータベース自体にあるかどうかです。したがって、あなたのケースでは、そのオブジェクトの主キーを介してRealmに最初に照会する必要があり、nilではないことが判明した場合は、そのオブジェクトが既に配列内にあるかどうかを確認してください。

+0

今後Realmのユーザーにコメントを追加したいだけです。私はTiMは '[ objectForPrimaryKey:...]'を意味すると思います。私は文字通り '[RLMObject objectForPrimaryKey:...]'とタイプし、 "RLMObject"がRealmデータベースに永続化されていないというクラッシュを受けました:P – Zhang

+0

ええ、それは暗示されていました。解明してくれてありがとう! – TiM

関連する問題