realmで1対多数のリレーションシッププロパティを設定すると
[bag.items addObject:item];
のように追加出来るが、追加するモデルのプライマリーキーが重複すると例外を吐いてしまう。
上記のようにBagモデルとitemモデルがある例では、Bag.itemsにitemを追加すると同時にItemモデルのデータベースにも追加しているからだ。
この場合
if ([Item objectsWhere:@"id_str = %@",item.id_str].count==0) {
[bag.items addObject:item];
}
といったように、Itemモデルに既に存在しているかどうか確かめてから追加する必要がある。
あと気になったのは、addOrUpdateObjectがRLMArrayに対応していない事なのだけど上記の例はいいとして情報が更新されたモノをitemsに追加する場合はいちいちforで探してそのindexのオブジェクトとreplaceしないといけないのだろうか…?ベストプラクティスが知りたい。
コメントにて、addObjectの前にaddOrUpdateObjectを行えばよいと教えて頂きました。
if ([Item objectsWhere:@"id_str = %@",item.id_str].count==0) {
//存在していないなら追加・更新してbagに追加する
[realm addOrUpdateObject:item];
[bag.items addObject:item];
}else{
//存在しているなら更新するだけ
[realm addOrUpdateObject:item];
}