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 して表示をアップデート。
エラー処理は書いてないけど、取り敢えずの流れはこんな感じってことで。