web-dev-qa-db-ja.com

コアデータのすべてのエントリを削除/リセットしますか?

Core Dataに保存されているすべてのエントリを削除する方法を知っていますか?私のスキーマは同じままでなければなりません。空白にリセットしたいだけです。


編集

ユーザーが本質的にresetボタンを押すことができるように、プログラムでこれを実行しようとしています。

227
Michael Grinich

NSFileManager:removeItemAtPath ::メソッドを使用して、プログラムでファイルを削除できます。

NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

次に、永続ストアを追加し直して、正しく再作成されるようにします。

プログラムによって各エンティティを反復処理する方法は、速度が遅く、エラーが発生しやすくなります。その方法で使用するのは、一部のエンティティを削除し、他のエンティティは削除しない場合です。ただし、参照整合性を維持する必要があります。そうしないと、変更を永続化できません。

ストアを削除して再作成するだけで高速かつ安全であり、実行時にプログラムで実行できます。

iOS5 +用に更新

IOS 5およびOS X 10.7に外部バイナリストレージ(ExternalBinaryDataStorageまたは外部レコードファイルに保存を許可)が導入されたため、storeURLが指すファイルを単に削除するだけでは不十分です。外部レコードファイルは残しておきます。これらの外部レコードファイルの命名スキームは公開されていないため、まだ普遍的な解決策はありません。 – an0 12年5月8日23:00

196
groundhog

SQLiteファイルは削除できますが、関数を使用してテーブルを個別にパージすることで削除します。

- (void) deleteAllObjects: (NSString *) entityDescription  {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityDescription inManagedObjectContext:_managedObjectContext];
    [fetchRequest setEntity:entity];

    NSError *error;
    NSArray *items = [_managedObjectContext executeFetchRequest:fetchRequest error:&error];
    [fetchRequest release];


    for (NSManagedObject *managedObject in items) {
        [_managedObjectContext deleteObject:managedObject];
        DLog(@"%@ object deleted",entityDescription);
    }
    if (![_managedObjectContext save:&error]) {
        DLog(@"Error deleting %@ - error:%@",entityDescription,error);
    }

}

テーブルごとに実行することを選択した理由は、テーブルの内容を削除するのが賢明であり、保持したいデータがないことをプログラミングしているときに確認できるからです。

これを行うと、ファイルを削除するよりもはるかに遅くなり、この方法に時間がかかりすぎる場合はファイル削除に変更します。

139
Grouchal

IOS 10以降の更新されたソリューション

NSBatchDeleteRequestを使用して、エンティティ内のすべてのオブジェクトを削除します。オブジェクトをメモリにロードしたり、繰り返し処理したりする必要はありません。

// create the delete request for the specified entity
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = MyEntity.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

// get reference to the persistent container
let persistentContainer = (UIApplication.shared.delegate as! AppDelegate).persistentContainer

// perform the delete
do {
    try persistentContainer.viewContext.execute(deleteRequest)
} catch let error as NSError {
    print(error)
}

このコードはiOS 10およびSwift 3.用に更新されました。iOS9をサポートする必要がある場合は、 この質問を参照してください。

出典:

54
Suragch

すべてのストアを通過し、コーディネーターとファイルシステムの両方から削除するclearStoresメソッドを作成しました(エラー処理は残されています):

NSArray *stores = [persistentStoreCoordinator persistentStores];

for(NSPersistentStore *store in stores) {
    [persistentStoreCoordinator removePersistentStore:store error:nil];
    [[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}

[persistentStoreCoordinator release], persistentStoreCoordinator = nil;

このメソッドは、coreDataHelperクラスの内部にあり、nilの場合、persistentStoreの作成を(特に)処理します。

37
samvermette

HomeViewControllerクラスのボタンイベントのコアデータからすべてのデータを削除します。この記事は、私が貢献できると思ったので非常に役立ちました。

-(IBAction)buttonReset:(id)sender
{
    NSLog(@"buttonReset Pressed");

    //Erase the persistent store from coordinator and also file manager.
    NSPersistentStore *store = [self.persistentStoreCoordinator.persistentStores lastObject];
    NSError *error = nil;
    NSURL *storeURL = store.URL;
    [self.persistentStoreCoordinator removePersistentStore:store error:&error];
    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error];


    NSLog(@"Data Reset");

    //Make new persistent store for future saves   (Taken From Above Answer)
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
        // do something with the error
    }

}

Self.persistentStoreCoordinatorを呼び出すために、Home View Controllerでプロパティを宣言したことに注意してください。 (保存およびロードに使用するmanagedObjectContextについて心配する必要はありません。)

@property (nonatomic, retain) NSManagedObjectContext        *   managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator  *   persistentStoreCoordinator;

次に、AppDelegate ApplicationDidFinishLaunchingのすぐ下にHomeViewControllerを作成します。

homeViewController = [[HomeViewController alloc] initWithNibName:@"HomeViewController" bundle:nil];
homeViewController.managedObjectContext = self.managedObjectContext;
homeViewController.persistentStoreCoordinator = self.persistentStoreCoordinator;
27
atreat

MagicalRecord は、これを非常に簡単にします。

[MyCoreDataObject MR_truncateAll];
21
Brian King

iOS9 +、Swift 2

すべてのエンティティのすべてのオブジェクトを削除します

func clearCoreDataStore() {
    let entities = managedObjectModel.entities
    for entity in entities {
        let fetchRequest = NSFetchRequest(entityName: entity.name!)
        let deleteReqest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try context.executeRequest(deleteReqest)
        } catch {
            print(error)
        }
    }
}
16
Andres Wang

[より新しい応答を求める報奨金に対する遅い回答]

以前の回答を見て、

  • @Grouchalなどが提案するように、すべてのアイテムを取得して削除することは、依然として効果的で便利なソリューションです。非常に大きなデータストアがある場合、処理速度は遅くなりますが、それでも非常にうまく機能します。
  • あなたと@groundhogが述べているように、単にデータストアを削除することはもはや効果的ではありません。廃止されました外部バイナリストレージを使用しない場合でも iOS 7はSQLiteジャーナリングにWALモードを使用するためです。 WALモードでは、Core Dataの永続ストア用に(潜在的に大きな)ジャーナルファイルが存在する場合があります。

ただし、機能する永続ストアを削除するには、別の同様のアプローチがあります。重要なのは、永続ストアファイルを、他の何も含まない独自のサブディレクトリに配置することです。ドキュメントディレクトリ(またはどこでも)に固定するのではなく、永続ストア用に新しいサブディレクトリを作成します。そのディレクトリの内容は、永続ストアファイル、ジャーナルファイル、および外部バイナリファイルになります。データストア全体を破棄する場合は、そのディレクトリを削除すると、それらはすべて消えます。

永続ストアを設定するときに、次のようなことをします。

NSURL *storeDirectoryURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"persistent-store"];
if ([[NSFileManager defaultManager] createDirectoryAtURL:storeDirectoryURL
        withIntermediateDirectories:NO
        attributes:nil
        error:nil]) {
    NSURL *storeURL = [storeDirectoryURL URLByAppendingPathComponent:@"MyApp.sqlite"];
    // continue with storeURL as usual...
}

その後、ストアを削除したいときに、

[[NSFileManager defaultManager] removeItemAtURL:storeDirectoryURL error:nil];

これにより、カスタムサブディレクトリとその中のすべてのコアデータファイルの両方が再帰的に削除されます。

これは、他の重要なデータと同じフォルダーに永続ストアがまだない場合にのみ機能します。おそらく他の有用なものが含まれているドキュメントディレクトリのように。それがあなたの状況なら、あなたがdoを残して他のすべてを削除したいファイルを探すことで同じ効果を得ることができます。何かのようなもの:

NSString *docsDirectoryPath = [[self applicationDocumentsDirectory] path];
NSArray *docsDirectoryContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:docsDirectoryPath error:nil];
for (NSString *docsDirectoryItem in docsDirectoryContents) {
    // Look at docsDirectoryItem. If it's something you want to keep, do nothing.
    // If it's something you don't recognize, remove it.
}

このアプローチはエラーを起こしやすいかもしれませんevery保持するファイルを知っていることを絶対に確認する必要があります。一方、外部バイナリファイルは、保存に使用されるファイル/ディレクトリ名を実際に知らなくても削除できます。

13
Tom Harrington

コアデータをパージするための複合ソリューションを次に示します。

- (void)deleteAllObjectsInCoreData
{
    NSArray *allEntities = self.managedObjectModel.entities;
    for (NSEntityDescription *entityDescription in allEntities)
    {
        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        [fetchRequest setEntity:entityDescription];

        fetchRequest.includesPropertyValues = NO;
        fetchRequest.includesSubentities = NO;

        NSError *error;
        NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

        if (error) {
                NSLog(@"Error requesting items from Core Data: %@", [error localizedDescription]);
            }

        for (NSManagedObject *managedObject in items) {
            [self.managedObjectContext deleteObject:managedObject];
        }

        if (![self.managedObjectContext save:&error]) {
            NSLog(@"Error deleting %@ - error:%@", entityDescription, [error localizedDescription]);
        }
    }  
}
10
GxocT

すべてのオブジェクトを削除し、バッキングファイルを削除しない場合は、次の方法を使用できます。

- (void)deleteAllObjectsInContext:(NSManagedObjectContext *)context
                       usingModel:(NSManagedObjectModel *)model
{
    NSArray *entities = model.entities;
    for (NSEntityDescription *entityDescription in entities) {
        [self deleteAllObjectsWithEntityName:entityDescription.name
                                   inContext:context];
    }
}

- (void)deleteAllObjectsWithEntityName:(NSString *)entityName
                             inContext:(NSManagedObjectContext *)context
{
    NSFetchRequest *fetchRequest =
        [NSFetchRequest fetchRequestWithEntityName:entityName];
    fetchRequest.includesPropertyValues = NO;
    fetchRequest.includesSubentities = NO;

    NSError *error;
    NSArray *items = [context executeFetchRequest:fetchRequest error:&error];

    for (NSManagedObject *managedObject in items) {
        [context deleteObject:managedObject];
        NSLog(@"Deleted %@", entityName);
    }
}

非常に遅い可能性があることに注意してください(オブジェクトグラフに含まれるオブジェクトの数によって異なります)。

10
Marián Černý

すべてのオブジェクトを削除するルート(コアデータスタックを破棄するよりもはるかに簡単ですが、パフォーマンスは低下します)にしたい場合は、これがより良い実装です:

- (void)deleteAllManagedObjectsInModel:(NSManagedObjectModel *)managedObjectModel context:(NSManagedObjectContext *)managedObjectContext
{
    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
        [managedObjectContext performBlockAndWait:^{
            for (NSEntityDescription *entity in managedObjectModel) {
                NSFetchRequest *fetchRequest = [NSFetchRequest new];
                [fetchRequest setEntity:entity];
                [fetchRequest setIncludesSubentities:NO];
                NSArray *objects = [managedObjectContext executeFetchRequest:fetchRequest error:nil];
                for (NSManagedObject *managedObject in objects) {
                    [managedObjectContext deleteObject:managedObject];
                }            
            }

            [managedObjectContext save:nil];
        }];
    }];
    [operation setCompletionBlock:^{
        // Do stuff once the truncation is complete
    }];
    [operation start];
}

この実装は、NSOperationを活用して、メインスレッドから削除を実行し、完了時に通知します。完了ブロック内の通知または何かを送信して、ステータスをメインスレッドにバブルすることができます。

6
Blake Watters

iOS 10 + Swift 3ソリューション:

func clearCoreDataStore() {
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext

    for i in 0...delegate.persistentContainer.managedObjectModel.entities.count-1 {
        let entity = delegate.persistentContainer.managedObjectModel.entities[i]

        do {
            let query = NSFetchRequest<NSFetchRequestResult>(entityName: entity.name!)
            let deleterequest = NSBatchDeleteRequest(fetchRequest: query)
            try context.execute(deleterequest)
            try context.save()

        } catch let error as NSError {
            print("Error: \(error.localizedDescription)")
            abort()
        }
    }
}

すべてのコアデータエンティティを反復処理し、クリアします

5
KVISH

迅速なソリューション:

class func deleteAllManagedObjects() {

        let modelURL = NSBundle.mainBundle().URLForResource("some string", withExtension: "mom")
        let mom = NSManagedObjectModel(contentsOfURL: modelURL)

        for entityName in mom.entitiesByName.keys {
            let fr = NSFetchRequest(entityName: entityName as String)
            let a = Utility.managedObjectContext().executeFetchRequest(fr, error: nil) as [NSManagedObject]
            for mo in a {
                Utility.managedObjectContext().deleteObject(mo)
            }
        }

        Utility.managedObjectContext().save(nil)
    }
4
János

これは、AppDelegate selfへの呼び出しが少なく、上位の回答から除外されたコードの最後のビットが含まれた、やや簡略化されたバージョンです。また、「このNSManagedObjectContextのコーディネーターからオブジェクトの永続ストアに到達できない」というエラーが表示されていたため、追加し直す必要がありました。

NSPersistentStoreCoordinator *storeCoordinator = [self persistentStoreCoordinator];
NSPersistentStore *store = [[storeCoordinator persistentStores] lastObject];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"dataModel"];
NSError *error;

[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];

if (storeCoordinator != nil) {
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator:storeCoordinator];
}
4
Alberto Lopez

投稿いただきありがとうございます。私はそれに従い、それは私のために働いた。しかし、私は別の問題を抱えていて、どの回答にも言及されていませんでした。だから、それが私だけだったかどうかはわかりません。

とにかく、ここに問題とそれを解決した私の方法を投稿すると思いました。

データベースにいくつかのレコードがありました。dbに新しいデータを書き込む前にすべてをクリーンにしたかったので、

[[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 

その後、managedObjectContextを使用してデータベースにアクセスしました(今は空であると想定されています)。しばらくのトラブルシューティングの後、managedObjectContextを使用してdabaseにアクセスする前に、managedObjectmanagedObjectModelpersistentStoreCoordinator、およびmanagedObjectContextをリ​​セットする必要があることがわかりました。これで、書き込み用のきれいなデータベースができました。

3
DanielZ

この質問に対するいくつかの良い答え。ここにニースの簡潔なものがあります。最初の2行は、sqliteデータベースを削除します。次に、for:ループは、managedObjectContextメモリ内のオブジェクトを削除します。

NSURL *storeURL = [[(FXYAppDelegate*)[[UIApplication sharedApplication] delegate] applicationDocumentsDirectory] URLByAppendingPathComponent:@"AppName.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];
for (NSManagedObject *ct in [self.managedObjectContext registeredObjects]) {
    [self.managedObjectContext deleteObject:ct];
}
3
adamek

他の場所で検索を保存するためのクイックリファレンスとして-削除後に永続ストアを再作成するには、次のようにします。

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// do something with the error
}
3
TimD

NSFileManagerでURL​​を削除しても受け入れられる答えは正しいですが、iOS 5+の編集で述べられているように、永続ストアは1つのファイルだけでは表されていません。 SQLiteストアの場合、*。sqlite、*。sqlite-shm、および* .sqlite-walです...幸いなことにiOS 7以降ではメソッドを使用できます

[NSPersistentStoreCoordinator + removeUbiquitousContentAndPersistentStoreAtURL:options:error:]

削除の世話をするため、コードは次のようになります。

NSPersistentStore *store = ...;
NSError *error;
NSURL *storeURL = store.URL;
NSString *storeName = ...;
NSPersistentStoreCoordinator *storeCoordinator = ...;
[storeCoordinator removePersistentStore:store error:&error];
[NSPersistentStoreCoordinator removeUbiquitousContentAndPersistentStoreAtURL:storeURL.path options:@{NSPersistentStoreUbiquitousContentNameKey: storeName} error:&error];
2
JakubKnejzlik

すべてのエンティティ名を検索し、名前で削除することもできます。長いバージョンですが、うまく機能します。そのため、永続ストアを操作する必要はありません。

 - (void)clearCoreData
{
NSError *error;
NSEntityDescription *des = [NSEntityDescription entityForName:@"Any_Entity_Name" inManagedObjectContext:_managedObjectContext];
NSManagedObjectModel *model = [des managedObjectModel];
NSArray *entityNames = [[model entities] valueForKey:@"name"];

for (NSString *entityName in entityNames){

    NSFetchRequest *deleteAll = [NSFetchRequest fetchRequestWithEntityName:entityName];
    NSArray *matches = [self.database.managedObjectContext executeFetchRequest:deleteAll error:&error];

}
    if (matches.count > 0){
        for (id obj in matches){

            [_managedObjectContext deleteObject:obj];
        }
       [self.database.managedObjectContext save:&error];
    }
}

「Any_Entity_Name」はエンティティの名前のいずれか1つを指定するだけであるため、エンティティが存在するエンティティの説明を把握するだけです。 ValueForKey @ "name"は、すべてのエンティティ名を返します。最後に、保存することを忘れないでください。

2
Chris Lin

これは、所有するすべてのテーブルのすべてのレコードを削除するバージョンです。

Swift 4

static func resetDatabase() {
    do {
        try dataStore.persistentStoreCoordinator.managedObjectModel.entities.forEach { (entity) in
            if let name = entity.name {
                let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: name)
                let request = NSBatchDeleteRequest(fetchRequest: fetch)
                try mainContext.execute(request)
            }
        }

        try mainContext.save()
    } catch {
        print("error resenting the database: \(error.localizedDescription)")
    }
}
1
Politta

(アプリの要件に基づいて)私がよく使用するもう1つの方法(バッチ削除要求を除く)は、永続ストアをリセットすることです。 iOS 10以降およびSwiftの実装は次のようになります(CoreDataManagerクラスがある場合):

let persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "<Data-Model-Name>“)
    container.loadPersistentStores(completionHandler: { (storeDescription, err) in
        if let err = err {
            fatalError("loading of store failed: \(err)")
        }
    })
    return container
}()

func resetPersistentStore() {

    if let persistentStore = persistentContainer.persistentStoreCoordinator.persistentStores.last {
        let storeURL = persistentContainer.persistentStoreCoordinator.url(for: persistentStore)

        do {
            try persistentContainer.persistentStoreCoordinator.destroyPersistentStore(at: storeURL, ofType: NSSQLiteStoreType, options: nil)
        } catch {
            print("failed to destroy persistent store:", error.localizedDescription)
        }

        do {
            try persistentContainer.persistentStoreCoordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: storeURL, options: nil)
        } catch {
            print("failed to re-add persistent store:", error.localizedDescription)
        }
    }

}

この方法の利点の1つは、特にコアデータの多数のエンティティのデータレコードが大量にある場合に、より簡単であることです。この場合、バッチ削除要求はメモリを集中的に使用します。

0

これを使って

+(NSArray *)fetchDataFromEntity:(NSString *)entityName context:(NSManagedObjectContext *)context
{
    NSFetchRequest * fetchRequest =[[NSFetchRequest alloc] init];
    NSEntityDescription * CategoriesEntity = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    [fetchRequest setEntity:CategoriesEntity];

    NSError * error;
    NSInteger count = [context countForFetchRequest:fetchRequest error:&error];

    if (count && count>0) {

        NSArray * fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
        if (fetchedObjects && fetchedObjects.count>0) {

            return fetchedObjects;
        }else
            return nil;

    }
    else
        return nil;
}
+ (void)deleteObjectsOfArray:(NSMutableArray*)ary context:(NSManagedObjectContext *)context {
    for (NSManagedObject * obj in ary) {
        [context deleteObject:obj];
    }
    NSError *saveError = nil;
    [context save:&saveError];
}
+ (void)deleteEntity:(NSString *)entityName context:(NSManagedObjectContext *)context {
    NSArray *listArray = [self fetchDataFromEntity:entityName context:context];
    [self deleteObjectsOfArray:[NSMutableArray arrayWithArray:listArray] context:context];
}
0
Sandeep Singh

永続ストアファイルを削除し、新しい永続ストアコーディネーターをセットアップしますか?

0
Hunter

Grouchalのコードを取得し、同時実行モード(NSEnumerationConcurrent)で列挙を使用して速度を上げました。forループに比べて少し高速になりました(アプリでは、削除するのではなくデータをクリアしてテストケースを実行できるように、この機能をテスターに​​追加しましたアプリをインストールします)

- (void)resetObjects
{
    [self deleteAllObjectsInEntity:@"Entity1"];
    [self deleteAllObjectsInEntity:@"Entity2"];
    [self deleteAllObjectsInEntity:@"Entity3"];
    [self deleteAllObjectsInEntity:@"Entity4"];
}

-(void) deleteAllObjectsInEntity:(NSString*) entityName
{
    MainDataContext *coreDataContext = [MainDataContext sharedInstance];
    NSManagedObjectContext *currentContext = coreDataContext.managedObjectContext;
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:currentContext];
    [fetchRequest setEntity:entity];

    NSError *error;
    NSArray *items = [currentContext executeFetchRequest:fetchRequest error:&error];

    [items enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:^(NSManagedObject * obj, NSUInteger idx, BOOL *stop) {
        [currentContext deleteObject:obj];
    }];


    if (![currentContext save:&error]) {
        NSLog(@"Error deleting %@ - error:%@",entityName,error);
    }
}
0
anoop4real

MagicalRecordを使用しており、デフォルトの永続ストアがあるとします:

特定のファイルが存在すること、および/またはエンティティ名やクラスの入力を要求することを前提とするすべてのソリューションが好きではありません。これはSwift(2)で、すべてのエンティティからすべてのデータを削除する安全な方法です。削除すると、新しいスタックも再作成されます(実際、この部分がどの程度必要かはわかりません)。

すべてを削除したいが、作業ストアと新しいデータを取得するmocが必要な場合(ユーザーがログインしたら...)

extension NSManagedObject {

    class func dropAllData() {

        MagicalRecord.saveWithBlock({ context in

            for name in NSManagedObjectModel.MR_defaultManagedObjectModel().entitiesByName.keys {
                do { try self.deleteAll(name, context: context) }
                catch { print("⚠️ ✏️ Error when deleting \(name): \(error)") }
            }

            }) { done, err in
                MagicalRecord.cleanUp()
                MagicalRecord.setupCoreDataStackWithStoreNamed("myStoreName")
        }
    }

    private class func deleteAll(name: String, context ctx: NSManagedObjectContext) throws {
        let all = NSFetchRequest(entityName: name)
        all.includesPropertyValues = false

        let allObjs = try ctx.executeFetchRequest(all)
        for obj in allObjs {
            obj.MR_deleteEntityInContext(ctx)
        }

    }
}
0
Aviel Gross

iOS 10およびSwift 3

エンティティ名が「Photo」であり、CoreDataStackクラスを作成するとします...

 func clearData() {
        do {            
            let context = CoreDataStack.sharedInstance.persistentContainer.viewContext
            let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Photo")
            do {
                let objects  = try context.fetch(fetchRequest) as? [NSManagedObject]
                _ = objects.map{$0.map{context.delete($0)}}
                CoreDataStack.sharedInstance.saveContext()
            } catch let error {
                print("ERROR DELETING : \(error)")
            }
        }
    }

CoreDataの使用方法とこのメソッドの使用方法の優れたチュートリアルを次に示します。 https://medium.com/compileswift/parsing-json-response-and-save-it-in-coredata-step-by-step-fb58fc6ce16f#.1tu6kt8qb

0
James Rochabrun

すべてのバージョンで動作します。エンティティ名を渡して繰り返し処理し、すべてのエントリを削除してコンテキストを保存します。

func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
    var context = NSManagedObjectContext()
    if #available(iOS 10.0, *) {
        context = self.persistentContainer.viewContext
    } else {
        context = self.managedObjectContext
    }

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
    fetchRequest.entity = NSEntityDescription.entity(forEntityName: entityToFetch, in: context)
    fetchRequest.includesPropertyValues = false
    do {
        let results = try context.fetch(fetchRequest) as! [NSManagedObject]
        for result in results {
            context.delete(result)
        }
        try context.save()
        completion(true)
    } catch {
        completion(false)
        print("fetch error -\(error.localizedDescription)")
    }
}
0
Karun Kumar

ここですべてのレコードを削除するための私のSwift3バージョン。 「ユーザー」はエンティティ名です

@IBAction func btnDelAll_touchupinside(_ sender: Any) {

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedObjectContext = appDelegate.persistentContainer.viewContext

    let fetchReq = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
    let req = NSBatchDeleteRequest(fetchRequest: fetchReq)

    do {
        try managedObjectContext.execute(req)

    } catch {
        // Error Handling
    }   
}
0
Kursat Turkay

FileURLPathからsqliteを削除してからビルドします。

0
Jai