CoreDataのトランザクション

2010/08/19

CoreDataはメモリ上にデータを管理(NSManagedObjectContext)しているため、保存処理は十分注意する必要がある。

例えば、新規でレコードを作りそれをキャンセル(メモリ破棄)する場合、deleteObjectsで削除してコミット(save)すれば動作するでしょう。

新規でない場合、しかし、既にフェッチしたデータを編集する場合は注意です。 やっぱりキャンセルしようとdeleteObjectsを使うと、その名の通りデータが削除されてコミットされてしまいます。

NSManagedObjectContext

NSManagedObjectContextに、saveやundo等の処理が定義されています。

- (NSSet *)insertedObjects;
- (NSSet *)updatedObjects;
- (NSSet *)deletedObjects;
- (NSSet *)registeredObjects;

- (void)undo;
- (void)redo;
- (void)reset;
- (void)rollback;
- (BOOL)save:(NSError **)error;

- (void)lock;
- (void)unlock;
- (BOOL)tryLock;

キャンセルする場合、差し当たりrollbackで良さそうだけどちょっと自信はない。。。 それぞれの挙動は、時間あったら調べておきます。

ちなみに、undoManagerってのも存在するので1つずつ戻すってことも簡単に(?)できそうです。

参考サイト

CoreData - トランザクション(5) まとめ