2016-10-04 38 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) 
     } 
    } 

最近我遷移到SWIFT 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) 
     } 
    } 

我的理解,現在我要聲明requestfetchRequest

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

的問題是,我不知道實體之前手。 swift 3中有任何解決方法或反思嗎?而且我對swift和核心數據很陌生,這是獲取或刪除對象的正常方式嗎?

+0

由於代碼重複,您的代碼有點令人困惑。你實例化相同的'NSFetchRequest' 3x。查看我的答案以獲得備用解決方案。 –

回答

3

在覈心數據的所有結果類型,包括NSManagedObject符合NSFetchRequestResult,以便使用該類型

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) 
    } 
} 

這是刪除一個實體的所有項目的推薦方式。
但是,部署目標必須≥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()是一個自定義的方法。

相關問題