0

Core Data Managed Objects にデータを格納するアプリケーションがあります。これらのオブジェクトには、NSString としての情報、NSNumber としてのブール値、および Transformable としてのデータ配列など、いくつかのプロパティが含まれています。

dataPoint.h:

@property (nonatomic, retain) id dataArray;
@property (nonatomic, retain) NSString * note;
@property (nonatomic, retain) NSNumber * bool;

dataPoint.m:

@dynamic dataArray;
@dynamic note;
@dynamic bool;

アプリケーション ユーザーは、変更を加えて保存またはキャンセルできます。すべての変更を元に戻すには、[managedObjectContest ロールバック] メソッドを呼び出します。追加の undoManager を設定していません。単純なデータ型 (NSString や NSNumber など) の場合、これは正常に機能します。ロールバックが呼び出された後、すべてのエントリは最後に保存された状態になります。しかし、これは格納された配列では機能しないようです。ロールバックが呼び出された後も、変更された値のみを取得します。アプリケーションを再起動した後にのみ、元の (最後に保存された) データが表示されます。

複雑なデータに対してロールバックを機能させるにはどうすればよいですか?

よろしくお願いします!

4

1 に答える 1

0

ロールバック後にエンティティを再フェッチするだけです。このようにして、永続ストアからのデータ (おそらく正しいデータ) が、変更された配列を置き換えます。

別のアプローチは、古い配列のコピーを保持し、それが可能であればデータの表示に使用することです (複数のビュー コントローラーにまたがっていない可能性があります)。

プロパティとしての配列は、NSManagedObjects に物を格納するためのかなり非標準的な方法です。この現象は、配列を取得すると、本質的にその配列へのポインターを取得するために発生します。配列を変更しますが、ポインターは同じままです。ロールバック中は何も変更する必要がないため、Core Data は何もしません。メモリ内の配列は Core Data には関係ありません。

面倒を見て、コアデータでも配列内のものをモデル化すると、はるかに良いでしょう。より堅固なデータ構造を持つことに加えて、より明示的で読みやすく保守しやすいコードになる可能性があります。

于 2013-01-22T07:38:03.750 に答える