コアデータ:エンティティのすべてのインスタンスを削除する最も簡単な方法


383

Core Dataを使用して、Webサービス呼び出しの結果をローカルに永続化しています。Webサービスは、「車」などの完全なオブジェクトモデルを返します。そのうちの約2000になる可能性があります(Webサービスが1台またはすべての車より少ないものを返すようにすることはできません)。

次にアプリケーションを開いたときに、すべての車のWebサービスを再度呼び出して、コアデータの永続化されたコピーを更新したいのですが、重複を防ぐために、最初にローカルキャッシュのすべてのデータを消去する必要があります。

管理オブジェクトコンテキスト内の特定のエンティティのすべてのインスタンス(たとえば、タイプ「CAR」のすべてのエンティティ)を削除するより速い方法はありますか、またはそれらを呼び出してクエリし、結果を反復してそれぞれを削除してから保存する必要がありますか?

理想的には、エンティティがBlahであるすべてを削除すると言うことができます。


メモリ内データベースを使用できます
J. Doe

回答:


718

iOS 9以降:

iOS 9にはNSBatchDeleteRequest、述語に一致するオブジェクトをすべてメモリに読み込まなくても簡単に削除できるという新しいクラスが追加されました。使用方法は次のとおりです。

スウィフト5

let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
    try myPersistentStoreCoordinator.execute(deleteRequest, with: myContext)
} catch let error as NSError {
    // TODO: handle the error
}

Objective-C

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];

NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:delete withContext:myContext error:&deleteError];

バッチ削除の詳細については、WWDC 2015の「コアデータの新機能」セッション〜14:10から)を参照してください。

iOS 8以前:

すべてをフェッチしてすべて削除:

NSFetchRequest *allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Car" inManagedObjectContext:myContext]];
[allCars setIncludesPropertyValues:NO]; //only fetch the managedObjectID

NSError *error = nil;
NSArray *cars = [myContext executeFetchRequest:allCars error:&error];
[allCars release];
//error handling goes here
for (NSManagedObject *car in cars) {
  [myContext deleteObject:car];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here

74
また、NSManagedObjectIDのみを取得するようにフェッチを構成して、オブジェクト構造全体のロードによるオーバーヘッドを削減します。
マーカスS.ザラ09/09/05

38
NSMangagedObjectIDだけをフェッチする方法は明らかではありません。[allCars setIncludesPropertyValues:NO]を使用してください。(そしてオブジェクトIDのNSPropertyDescriptionを作成する方法を探し回る必要はありません!)
ohhorob

6
初心者向けの質問で申し訳ありません:forループの終了後にコンテキストを保存する必要がありますか?例:[myContext save];
スティーブ

6
これをより効率的にする新しい機能がCore Dataにありますか?これは、Core Dataへの移植がすでに進んでいる私のアプリにとって深刻な問題です。複数のテーブルの1つから4000エントリすべてを削除するには、数秒かかります。これは、ユーザーが待つには長すぎます。同じリクエストを直接sqliteで直接処理するように見えます。
デビッド

4
@DaveDeLong NSBatchDeleteRequestがNSFetchedResultsControllerデリゲートをトリガーする方法 私はほとんどすべてを試しますが、何も起こりません。
外国人2015

36

Swift 3でエンティティをリセット:

func resetAllRecords(in entity : String) // entity = Your_Entity_Name
    {

        let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
        do
        {
            try context.execute(deleteRequest)
            try context.save()
        }
        catch
        {
            print ("There was an error")
        }
    }

32

もう少しクリーンでユニバーサル:このメソッドを追加します:

- (void)deleteAllEntities:(NSString *)nameEntity
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:nameEntity];
    [fetchRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID

    NSError *error;
    NSArray *fetchedObjects = [theContext executeFetchRequest:fetchRequest error:&error];
    for (NSManagedObject *object in fetchedObjects)
    {
        [theContext deleteObject:object];
    }

    error = nil;
    [theContext save:&error];
}

16

Swift 2.0の場合:

class func clearCoreData(entity:String) {
  let fetchRequest = NSFetchRequest()
  fetchRequest.entity = NSEntityDescription.entityForName(entity, inManagedObjectContext: moc!)
  fetchRequest.includesPropertyValues = false
  do {
    if let results = try moc!.executeFetchRequest(fetchRequest) as? [NSManagedObject] {
      for result in results {
        moc!.deleteObject(result)
      }

      try moc!.save()
    }
  } catch {
    LOG.debug("failed to clear core data")
  }
}

12

迅速:

let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: context)
fetchRequest.includesPropertyValues = false

var error:NSError?
if let results = context.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject] {
    for result in results {
        context.deleteObject(result)
    }

    var error:NSError?
    if context.save(&error) {
        // do something after save

    } else if let error = error {
        println(error.userInfo)
    }

} else if let error = error {
    println("error: \(error)")
}

1
この回答は、新しいtry / catchエラー処理で更新する必要があります
Suragch

10

これは、ここでの質問と同様の質問あり、関係削除ルールを設定して、1つのオブジェクトのみを削除するように提案された人がいます。したがって、車と多対多の関係を持つエンティティを作成するか、作成できる場合、上位のエンティティを削除するときに削除規則をカスケードに設定すると、すべての車も削除されます。これにより、すべての車のロードに関連する手順を実行する必要がないため、処理時間を節約できます。より大きなデータセットでは、これは絶対に必要になる可能性があります。


1
約600のコアデータオブジェクトを持つ現在のプロジェクトでこれを試したところです。カスケードを使用してそれらを別のオブジェクトにカプセル化すると、削除に約9.1秒かかりました。Daveが提案した方法を使用した場合、削除には約8.7秒かかります。私にとって顕著な違いはありません。
Andrew Zimmer、2012年

8

良い回答がすでに投稿されています。これは単なる推奨事項です!

良い方法は、カテゴリを追加して、NSManagedObject私がしたようにメソッドを実装することです:

ヘッダーファイル(例NSManagedObject+Ext.h

@interface NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString*) entityName;

@end

コードファイル:(例:NSManagedObject + Ext.m)

@implementation NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString *)entityName {
    NSManagedObjectContext *managedObjectContext = [AppDelegate managedObjectContext];
    NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
    [allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]];
    [allRecords setIncludesPropertyValues:NO];
    NSError * error = nil;
    NSArray * result = [managedObjectContext executeFetchRequest:allRecords error:&error];
    for (NSManagedObject * profile in result) {
        [managedObjectContext deleteObject:profile];
    }
    NSError *saveError = nil;
    [managedObjectContext save:&saveError];
}

@end

...あなたがしなければならない唯一のことは、アプリのデリゲートから、またはあなたがそれを持っているすべての場所からmanagedObjectContextを取得することです;)

その後、次のように使用できます。

[NSManagedObject deleteAllFromEntity:@"EntityName"];

さらに最適化するには、entitynameのパラメーターを削除し、代わりにclazznameから名前を取得します。これは使用法につながります:

[ClazzName deleteAllFromEntity];

よりクリーンな実装(NSManagedObjectContextのカテゴリとして):

@implementation NSManagedObjectContext (Logic)

- (void) deleteAllFromEntity:(NSString *)entityName {
    NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
    [allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:self]];
    [allRecords setIncludesPropertyValues:NO];
    NSError * error = nil;
    NSArray * result = [self executeFetchRequest:allRecords error:&error];
    for (NSManagedObject * profile in result) {
        [self deleteObject:profile];
    }
    NSError *saveError = nil;
    [self save:&saveError];
}

@end

次に使用法:

[managedObjectContext deleteAllFromEntity:@"EntityName"];

1
申し訳ありませんが、[AppDelegate managedObjectContext]必ずしも「クリーンなアーキテクチャ」であるとは限りません.. ;-)
Daniel Rinser

はい、そうです。上記のコードは、1つのmanagedObjectContextに基づいています。主なもの;)マルチスレッドコードでは、通常、アプリデリゲートのメインMOCを他のMOCにマージします
Erhard Dinhobl

1
@DanielRinserができるdeleteAllFromEntity: inManagedObjectContext:
Mohamed Elkassas

はい。deleteAllFromEntityメソッドをクラスメソッドからオブジェクトメソッドに変更することをお勧めします。その後、MOCインスタンスで直接deleteAllFromEntityを呼び出すことができます。
Erhard Dinhobl

7

Swift 4、iOS 12およびXcode 10アップデート

100%カット&ペーストするだけ

この関数を関連するクラスに配置し、この関数を関数self.deleteData()viewDidLoad()またはボタンの下または関数またはボタンの下で呼び出すと、ボタンをクリックすることでエンティティからのすべてのデータが削除され、「myEntity」があなたが定義したエンティティとして置き換えられます。コアデータ

func deleteData() {
    let appDel:AppDelegate = (UIApplication.shared.delegate as! AppDelegate)
    let context:NSManagedObjectContext = appDel.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "myEntity")
    fetchRequest.returnsObjectsAsFaults = false         
    do {
        let results = try context.fetch(fetchRequest)
        for managedObject in results {
            if let managedObjectData: NSManagedObject = managedObject as? NSManagedObject {
                context.delete(managedObjectData)
            }
        }
    } catch let error as NSError {
        print("Deleted all my data in myEntity error : \(error) \(error.userInfo)")
    }
}

ありがとうございますが、NSBatchDeleteRequestの概念が機能しないのはなぜですか?何か案が。
Suresh Durishetti 2018年

@SureshDurishettiクラスにCoreDataをインポートしましたか?
Xcodian Solangi

1
はい、CoreDateを追加しました。しかし、運はありません。
Suresh Durishetti、

4
コンテキストにsaveの呼び出しを追加するのを忘れて、context.save()を追加して、
準備完了

はい、これはコンテキストを保存する必要があります。そうでない場合、変更は発生しません
Surendra Kumar

5

Swift 3.XおよびSwift 4.X、簡単な方法。YourTableのみを変更

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourTable")
    fetchRequest.returnsObjectsAsFaults = false

    do
    {
        let results = try context.fetch(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            context.delete(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all my data in \(entity) error : \(error) \(error.userInfo)")
    }

また、次の構文を使用できます。let fetchRequest:NSFetchRequest <NSFetchRequestResult> = YourTable.fetchRequest()
Daniil

5

iOS 10以降

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

func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
        let context = NSManagedObjectContext()
        context = your 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)")
        }
    }

2
回答を投稿していただきありがとうございます。それは私にとってはうまくいきます。ただし、ここにコードをコピーして貼り付けるだけではいけません。初心者の場合、自分CoreDataStack()DataController()クラスが明確ではありません。更新をいただければ幸いです;)
Nico S.

4

Dave Delongの答えを拡張します。

iOS 9以前のバージョンにも対応したSwiftバージョン。これでエラー処理もカバーしました:

let appDelegate:AppDelegate = UIApplication.sharedApplication()。delegate as!AppDelegate

    let fetchRequest = NSFetchRequest(entityName: "Car")
    if #available(iOS 9.0, *) {
        let delete = NSBatchDeleteRequest(fetchRequest: fetchRequest)
        do {
            try appDelegate.persistentStoreCoordinator.executeRequest(delete, withContext: appDelegate.managedObjectContext)
        } catch let error as NSError {
            print("Error occured while deleting: \(error)")
        }
    } else {
        // Fallback on earlier versions
        let carRequest = NSFetchRequest()
        carRequest.entity = NSEntityDescription.entityForName("Cars", inManagedObjectContext: appDelegate.managedObjectContext)
        carRequest.includesPropertyValues = false

        do {
            let cars: NSArray = try appDelegate.managedObjectContext.executeFetchRequest(carRequest)

            for car in cars {
                appDelegate.managedObjectContext.delete(car)
            }

            try appDelegate.managedObjectContext.save()

        } catch let error as NSError {
            print("Error occured while fetching or saving: \(error)")
        }
    }

賛成。レコードを削除するiOS 9の方法は、実際にはawsmです。
Shobhakarティワリ

2

既存のキャッシュで受け取ったデータを折りたたんでみませんか?そうでなければ、それは実際には「リフレッシュ」ではなく、「再開」であり、SQLLiteファイルを削除/削除してから再開することもできます(他のデータも永続化していないと想定)。


1
悪い解決策。Sqliteデータベースに他のテーブルがある場合、明らかにそれらすべてが失われます。これは特定のソリューションに対するハックであり、より大きなケースでは考慮できません。
Deepak GM、

2

Swift 4、iOS 10以降の
静的関数。任意のエンティティに適用して、すべてのデータを削除できます。

protocol NSManagedObjectHelper {
}
extension NSManagedObject: NSManagedObjectHelper {
}
extension NSManagedObjectHelper where Self: NSManagedObject {
    static func removeAllObjectsInContext(_ managedContext: NSManagedObjectContext) {
        let request: NSFetchRequest = NSFetchRequest(entityName: String(describing: self))
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)
        do {
            deleteRequest.resultType = .resultTypeObjectIDs//to clear objects from memory
            let result = try managedContext.execute(deleteRequest) as? NSBatchDeleteResult
            if let objectIDArray = result?.result as? [NSManagedObjectID] {
                let changes = [NSDeletedObjectsKey : objectIDArray]
                /*By calling mergeChangesFromRemoteContextSave, all of the NSManagedObjectContext instances that are referenced will be notified that the list of entities referenced with the NSManagedObjectID array have been deleted and that the objects in memory are stale. This causes the referenced NSManagedObjectContext instances to remove any objects in memory that are loaded which match the NSManagedObjectID instances in the array.*/
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [managedContext])
            }
            try managedContext.save()
        } catch let error {
            print(error)
        }
    }
}

「部屋」はエンティティです

Room.removeAllObjectsInContext(self.persistentContainer.viewContext)

20191025に編集:「Self.fetchRequest()」命令は、同じプロジェクトで複数のターゲットを使用する場合に問題を引き起こす可能性があります。NSFetchRequest(entityName:String(describing:self))に置き換えられました


1

エンティティに多くのエントリが含まれている場合、メモリを節約できるため、このような方法が最適です。

 - (void)deleteAll:(NSManagedObjectContext *)managedObjectContext entityName:(NSString *)entityName
{
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [managedObjectContext setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];
    [fetchRequest setIncludesPropertyValues:NO];
    [fetchRequest setFetchLimit:100]; // you can change this number if you want
    NSError *error;
    NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    while ([items count] > 0) {
        @autoreleasepool {
            for (NSManagedObject *item in items) {
                [managedObjectContext deleteObject:item];
            }
            if (![managedObjectContext save:&error]) {
                NSLog(@"Error deleting %@ - error:%@",self.entityName, error);
            }
        }
        items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
    }
}

1

Swift 3.0の場合

 func deleteAllRecords() {
        //delete all data
        let context = appDelegate.persistentContainer.viewContext

        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "YourClassName")
        let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

        do {
            try context.execute(deleteRequest)
            try context.save()
        } catch {
            print ("There was an error")
        }
    }

1

このコードはiOS 9以下で動作します

class func deleteAllRecords(in entity : String) // entity = Your_Entity_Name
    {

        let context = CoreDataStack.getContext() // Note:- Replace your context here with CoreDataStack.getContext()
        let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
        if #available(iOS 9, *)
        {
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
            do
            {
                try context.execute(deleteRequest)
                try context.save()
            }
            catch
            {
                print("There was an error:\(error)")
            }
        }
        else
        {
            do{
                let deleteRequest = try context.fetch(deleteFetch)
                for anItem in deleteRequest {
                    context.delete(anItem as! NSManagedObject)
                }
            }
            catch
            {
                print("There was an error:\(error)")
            }
        }
        CoreDataStack.saveContext() // Note:- Replace your savecontext here with CoreDataStack.saveContext()
    }

1

iOS 9.0以降:

NSBatchDeleteRequestコアデータのレコードを削除するために使用されます。これは非常に高速に動作し、エンティティからすべてのレコードを削除するのにかかる時間が短くなります。それはNSFetchRequest議論に必要です。エンティティからすべてのレコードを削除したい場合は、それを使用できます。

let manageObject:NSManagedObjectContext = appDelegateObject.managedObjectContext

let fetchRequest = NSFetchRequest(entityName: EnityName”)

let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

let persistCor:NSPersistentStoreCoordinator = appDelegateObject.persistentObject
 do {
        try persistCor.executeRequest(deleteRequest, withContext: manageObject)
        try manageObject.save()
    } catch {
        print(error?.localizedDescription)
    }

1

DB内のすべてのオブジェクトのクイックパージ:

func purgeAllData() {
    let uniqueNames = persistentContainer.managedObjectModel.entities.compactMap({ $0.name })

    uniqueNames.forEach { (name) in
      let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: name)
       let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
         do {
        try persistentContainer.viewContext.execute(batchDeleteRequest)
      } catch {
        let nserror = error as NSError
        fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
      }
   }
 }

0

Dave DelongsのSwift 2.0の回答がクラッシュしました(iOS 9)

しかし、これはうまくいきました:

let fetchRequest = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    do {
        try managedObjectContext.executeRequest(deleteRequest)
        try managedObjectContext.save()
    }
    catch let error as NSError {
       // Handle error
    }

0

iOS 9「NSBatchDeleteRequest」と「NSManagedObjectContext」の拡張機能として実装された以前のiOSバージョンへのフォールバックを備えたSwift 3ソリューション。Appleリファレンスhttps://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html

extension NSManagedObjectContext {
    func batchDeleteEntities<T: NSManagedObject>(ofType type: T.Type) throws {
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing: type.self))
        if #available(iOS 9.0, *) {
            let request = NSBatchDeleteRequest(fetchRequest: fetchRequest)
            let result = try execute(request) as? NSBatchDeleteResult
            if let objectIDArray = result?.result as? [NSManagedObjectID] {
                let changes = [NSDeletedObjectsKey: objectIDArray]
                NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
            }
        } else {
            fetchRequest.includesPropertyValues = false
            let results = try fetch(fetchRequest)
            if let actualResults = results as? [NSManagedObject], !actualResults.isEmpty {
                actualResults.forEach { delete($0) }
            }
        }
    }
}

0

最小iOSが9.0の場合は、NSBatchDeleteRequestを使用して複数のレコードを削除します。バックグラウンドスレッドの場合は、NSManagedObjectContext saveを実行します。そうでない場合は、NSFetchRequestを使用してレコードを取得し、forループ内のすべてのレコードを削除し、削除が完了したらSaveします。


0

iOS 11.3およびSwift 4.1

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
        let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest )
        batchDeleteRequest.resultType = .resultTypeCount
        do {
            let batchDeleteResult = try dataController.viewContext.execute(batchDeleteRequest) as! NSBatchDeleteResult
            print("The batch delete request has deleted \(batchDeleteResult.result!) records.")
            dataController.viewContext.reset() // reset managed object context (need it for working)
        } catch {
            let updateError = error as NSError
            print("\(updateError), \(updateError.userInfo)")
        }

実行した後でリセットを呼び出す必要があります。そうでない場合は、テーブルビューで更新されません。


0
    func deleteAll(entityName: String) {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
    deleteRequest.resultType = .resultTypeObjectIDs
    guard let context = self.container?.viewContext
        else { print("error in deleteAll")
            return }

    do {
        let result = try context.execute(deleteRequest) as? NSBatchDeleteResult
        let objectIDArray = result?.result as? [NSManagedObjectID]
        let changes: [AnyHashable : Any] = [NSDeletedObjectsKey : objectIDArray as Any]
        NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
    } catch {
        print(error.localizedDescription)
    }
}

0

エンティティ名として文字列を使用しないOOP方法 Swift 3 +、Xcode 10+

func batchDelete<T>(in context: NSManagedObjectContext, fetchRequest: NSFetchRequest<T>) throws {
    guard let request = fetchRequest as? NSFetchRequest<NSFetchRequestResult> else {
        throw ErrorService.defaultError
    }
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: request)
    do {
        try context.execute(batchDeleteRequest)
    } catch {
        throw error
    }
}

次に、do / catchブロックを呼び出すだけです

    let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
    do {
        let data = try context.fetch(fetchRequest)
        if data.count > 0 {
            try self.batchDelete(in: context, fetchRequest: fetchRequest)
        }
    } catch {
        // throw error
    }

-1

Swift 2.0の場合:

func deleteAllData(entity: String)
{
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let managedContext = appDelegate.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: entity)
    fetchRequest.returnsObjectsAsFaults = false

    do 
    {
        let results = try managedContext.executeFetchRequest(fetchRequest)
        for managedObject in results
        {
            let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
            managedContext.deleteObject(managedObjectData)
        }
    } catch let error as NSError {
        print("Detele all data in \(entity) error : \(error) \(error.userInfo)")
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.