CoreDataのデータを一括削除する方法

とりあえずこんな感じのコードで動いてる。

// Delete current PersistentStore
NSURL *storeURL = [[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:@"coreDataTest.sqlite"];
NSPersistentStoreCoordinator *storeCoodinator = [self.managedObjectContext persistentStoreCoordinator];
NSPersistentStore  *store = [storeCoodinator persistentStoreForURL:storeURL];
NSError *error;
[storeCoodinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];

// Add new PersistentStore
[storeCoodinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];

// Reset NSFetchedResultController
[NSFetchedResultsController deleteCacheWithName:@"Root"];
[self.fetchedResultsController performFetch:&error];

[self.tableView reloadData];

昨日のメモのコードだと PersistentStore をどうやってゲットするの?と思ったけど、あれこれ悩んで NSURL を使ってみた。


まず、PersistentStore が保存されている NSURL を求める。これはアプリのイニシャライズ時に PersistentStore を作る時に使った NSURL と同じ物。coreDataTest.sqlite が実際のデータのファイル名。


PersistentStore の NSURL がゲットできれば、後は ManagedObjectContext から PersistentStoreCoodinator をゲットして、NSURL を使って PersistentStoreCoodinator から PersistentStore を削除。
次に実際の data.sqlite ファイルを NSFileManager を使って削除。
ここまでで削除の作業は終了。


次に同じNSURL を使って新しく PersistentStore を PersistentStoreCoodinator に登録。
もしも NSFetchedResultsController を使ってなければここまでで OK。
NSFetchedResultsController を使っている場合は、キャッシュを削除してからデータを読み込ませる。@"Root" はキャッシュ作成時の名前。


最後に TableView を reload して表示をアップデート。


エラー処理は書いてないけど、取り敢えずの流れはこんな感じってことで。