2016-11-16 5 views
0

ネストされたオブジェクトで簡単な更新をしようとしていますが、それが一貫して起こっていないことに気づいています。レルム内のネストされたオブジェクトを一貫して更新できません

仮想的に以下のクラスが関与していると仮定しましょう:

@interface Dog : RLMObject 
@property NSString *name; 
@property NSData *picture; 
@property NSInteger age; 
@end 

@interface Person : RLMObject 
@property NSString    *name; 
@property RLMArray<Dog *><Dog> *dogs; 
@end 

サーバーは私に更新され、犬の名前を持つPersonオブジェクトを渡した場合は、現在私は(擬似コードで)

for (Dog *dog in person.dogs) 
{ 
    dog.name = updatedDogName; 
} 

[defaultRealm beginWriteTransaction]; 
[defaultRealm addOrUpdateObject:person]; 
[defaultRealm commitWriteTransaction]; 

を行うだろう考察:
1)PersonとそれぞれのDogオブジェクトに固有の主キーがあります。
2)PersonとそれぞれのDogオブジェクトはすでにDBに保持されています。私は、単にPersonオブジェクトを通してDogオブジェクトを更新しています。

ここで何か問題がありますか?私は更新が約半分にしか起こらないことに気付きました。

+0

ハロージャスパー。この動作を示すサンプルプロジェクトを作成して[email protected]に電子メールで送る方法はありますか?問題を再現することができれば、何が起こっているのか把握するのに役立ちます。 – AustinZ

+0

このトランザクションで犬の名前だけを変更している場合と同様に、 '[defaultRealm addOrUpdateObject:person];も呼び出す必要はありません。この場合、 'Person'は主キーを持っていないので、これを呼び出すたびにデータベースに' Person'の新しいコピーが追加されます。 – TiM

+0

@AustinZ、私は書き込みトランザクションが進行中にwriteCopyToURLを使用してデータベースのサイズを圧縮することに問題があると思います。私は現在、この問題を軽減するためにオートリスプールに追加する必要のある箇所を追跡しています。書き込みトランザクションが行われている場合、またはデフォルトレルムのインスタンスに接続されているメモリにレルムオブジェクトが残っている場合、スマートな方法がありますか? –

答えて

0

問題は、Realmインスタンスがアタッチされているオブジェクトが使用中(たとえば、person.realm != nil)にwriteCopyToURLを呼び出すことに起因します。このような事態の可能性を減らすために、autoreleasepoolsをもっと自由に使用してください。

関連する問題