2009-11-12 9 views
14

NSManagedObjectContextからすべてのレコードを削除する方法はありますか?NSManagedObjectContext内のすべてのレコードを削除する

私はデータを挿入するには、次のコードを使用しています:

NSManagedObjectContext * context = [[NSApp delegate] managedObjectContext]; 
NSManagedObject  * basket = nil; 

basket = [NSEntityDescription insertNewObjectForEntityForName:@"ShoppingBasket" 
             inManagedObjectContext: context]; 
[basket setValue:[firstSelectedObject valueForKey:@"accessoryID"] 
      forKey: @"accessoryID"]; 

どのように私はすべてのレコードを削除しますか?私は "remove:"機能のようなものを望んでいるが、すべてを削除する。

答えて

39

特定のエンティティ(すべてのShoppingBasketを使用します)のインスタンスをすべて削除するには、すべてのバスケットをフェッチして削除するだけです。これは、わずか数行のコードです:

NSManagedObjectContext * context = [self managedObjectContext]; 
NSFetchRequest * fetch = [[[NSFetchRequest alloc] init] autorelease]; 
[fetch setEntity:[NSEntityDescription entityForName:@"ShoppingBasket" inManagedObjectContext:context]]; 
NSArray * result = [context executeFetchRequest:fetch error:nil]; 
for (id basket in result) 
    [context deleteObject:basket]; 
非ドキュメントベースのアプリで代替は、データストアへの接続をシャットダウンし、実際のファイルを削除し、その後、(付属していますテンプレートコードを再接続することです

標準コアデータプロジェクトは、ファイルが存在しない場合は自動的に作成されます)。次に、新しい、空の店を持っています。

コード例は、考えられるエラーをすべて無視します。それをしないでください。 :-)

+1

1つのコードラインソリューションはありませんか?つまり、コンテキストをフラッシュするか、コンテキストを空にするか、またはdeleteAll – aneuryzm

+0

いいえ。便利な "DROP DATABASE;"代役を務める。 –

+0

はい、あります。下記の返信をご覧ください。データベースを削除して再作成しましょう。 – runmad

5

はるかに速い方法は、店全体を完全に取り外すことです。この方法では、オブジェクトを取得する時間を無駄にしたり、他の答えと同じように列挙したりすることはありません。

NSError *error; 
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"MyCDStore.sqlite"]; 
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 

削除した後に再作成することを忘れないでください。

+0

この方法は安全ですか?コアデータは常にこの名前で保存されると仮定できますか?この場所はいつもですか? – msk

+0

同じ管理オブジェクトコンテキストを使用して再作成している場合は可能です。 – runmad

+2

これはiOSを前提としており、OS Xのドキュメントベースのデータストアに関する問題を無視しています。このようにユーザーの文書を叩くだけではいけません。 –