2016-10-04 2 views
0

私はSWIFT 2に、特定のエンティティからすべてのオブジェクトをクリア機能を持っていた:コアデータ:swift 3で "汎用"フェッチ/削除機能を書くには?

private static func clearTable(tableName : String) 
    { 
     let appDel = UIApplication.sharedApplication().delegate as! AppDelegate 
     let context : NSManagedObjectContext = appDel.managedObjectContext 
     let request = appDel.persistentStoreCoordinator 

     let fetchRequest = NSFetchRequest(entityName: tableName) 
     let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest) 

     do { 
      try request.executeRequest(deleteRequest, withContext: context) 
     } catch let error as NSError { 
      debugPrint(error) 
     } 
    } 

最近、私は迅速3に移行し、今では次のようになります。私は今、理解できるように

static func clearTable(_ tableName : String) 
    { 
     let appDel = UIApplication.shared.delegate as! AppDelegate 
     //let context : NSManagedObjectContext = appDel.managedObjectContext 
     let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
     let request = NSFetchRequest(entityName: tableName) 

     let fetchRequest: NSFetchRequest = NSFetchRequest(entityName: tableName) 
     let deleteRequest = NSBatchDeleteRequest(fetchRequest: NSFetchRequest(entityName: tableName)) 

     do { 
      try request.execute(deleteRequest, with: context) 
     } catch let error as NSError { 
      debugPrint(error) 
     } 
    } 

私はこの問題は私が前に実体を知らないということです

let fetchRequest: NSFetchRequest<SomeEntity> = NSFetchRequest(entityName: "SomeEntity") 

よう requestfetchRequestを宣言する必要がハンド。迅速な解決策はありますか?そして、私は迅速かつコアデータに新しいです、これはオブジェクトをフェッチまたは削除するための通常の方法ですか? NSManagedObjectを含むコアデータで

+0

コードの重複が原因でコードが少し混乱します。あなたは同じ 'NSFetchRequest' 3xをインスタンス化します。私の答えは別の解決策を見てください。 –

答えて

3

すべての結果の種類はそれほど種類

static func clearTable(_ tableName : String) 
{ 
    let appDel = UIApplication.shared.delegate as! AppDelegate 

    let context = appDel.persistentContainer.viewContext 
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: tableName) 
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: request) 
    let persistentStoreCoordinator = context.persistentStoreCoordinator! 

    do { 
    try persistentStoreCoordinator.execute(deleteRequest, with: context) 
    } catch let error as NSError { 
    debugPrint(error) 
    } 
} 

これは、エンティティのすべての項目を削除する推奨方法であることを使用NSFetchRequestResultに準拠しています。
ただし、展開ターゲットはiOS 9/macOS 10.11以上である必要があります。

PS:スウィフト3で、私はより良い方法のための機能に

static func clear(table tableName : String) { ... 
+0

今、別のエラーが発生しました。request.execute()の引数が0になります。 – Jamil

+0

context.execute()はうまく動作します。 – Jamil

0

チェックアウトこのbatch delete exampleを宣言したいです。

私は、CodeDataStackパターンを使用してコードを分かりやすくしています。

拡張機能を使用すると、コードをより動的にすることができます。テーブル名を渡す代わりに、単にmodel.delete()またはModel.deleteAll()を呼び出すことができます。これは、他のWebフレームワークで使用される一般的なパターンです。

ModelExtension.swift

extension NSManagedObject { 

    static func context() -> NSManagedObjectContext { 
     let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.coreData.context() 
    } 
    public func delete() { 
    managedObjectContext?.delete(self) 
    } 

    public static func deleteAll() { 
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: self.fetchRequest()) 
    do { 
     try context().execute(batchDeleteRequest) 
    } catch { 
     // Error Handling 
    } 
    } 
} 

単体テスト:

// My entity name is `Location` 
func test_deleteAll() { 
    _ = fixture.buildTestLocation() 
    _ = fixture.buildTestLocation() 
    coreData.saveContext() 

    Location.deleteAll() 

    XCTAssertEqual(0, Location.all()?.count) 
} 
func test_delete() { 
    let location = fixture.createTestLocation() 
    XCTAssertEqual(1, Location.all()?.count) 

    location.delete() 
    coreData.saveContext() 

    XCTAssertEqual(0, Location.all()?.count) 
} 

Location.all()は、カスタムメソッドであること。

関連する問題