2017-05-23 27 views
0

我是新手進入iOS開發和與coredata工作下跌。核心數據實體保存/更新合併策略爲NSMergeByPropertyObjectTrumpMergePolicy在xcode中拋出編譯器錯誤?

我已經創建了一個AppPage實體PAGEID屬性,它標誌着作爲唯一約束。

現在我可以使用下面的代碼行插入AppPage

let context = getAppDelegate().persistentContainer.viewContext 


    let appPage = AppTable(context: context) 

    appPage.pageId = 12 
    appPage.pContent = "Hello ManiKanta" 


    do{ 
     try getAppDelegate().persistentContainer.viewContext.save() 

     print("saved successfully") 
    }catch{ 
     print("error while saving") 
    } 

現在,當我想在這裏的是,如果再次PAGEID 12和 pContent行新的更新信息實體中的同一行應更新更新的信息。

我用Google搜索並發現了

getAppDelegate().persistentContainer.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy

但設置NSMergeByPropertyObjectTrumpMergePolicy是給我在我的XCode的編譯錯誤(v8.3.2)

基本上插入一行,如果它不存在,否則用給定的id更新該行。

這是Xcode引發的編譯錯誤。

Use of unresolved identifier NSMergeByPropertyObjectTrumpMergePolicy

+0

如果您遇到編譯器錯誤,您應該**總是**準確地說出那個錯誤是什麼。這是你的問題的關鍵細節。 –

+0

謝謝湯姆,我編輯了這個問題的建議,請檢查 – Manikanta

回答

0

你需要一個AppTablepageId取。 如果找到,請使用必須更新的數據。 如果您沒有找到,請創建一個新的,就像您在問題中顯示的一樣。 如果你發現很多,你有一個錯誤來處理。

你的情況:

let context = getAppDelegate().persistentContainer.viewContext 
let request: NSFetchRequest<AppTable> = NSFetchRequest(entityName: "AppTable") 
let fetchId = 12 
request.predicate = NSPredicate(format: "pageId == %d", fetchId) 
    do { 
     let fetched = try context?.fetch(request) 
     // you should find 1 
     if fetched?.count == 1 { 
      print("same pageId: /(fetchId)") 
      // you can update it here if you want 
     } else if fetched?.count == 0 { 
      // There is no AppTable with this id so create a new one 
      let appPage = AppTable(context: context) 
      // Populate all the properties here and save 
      // ... 
+0

謝謝pesch,我已經實現了上述方式(我保留它作爲備份計劃),我想更有意地通過指定系統來合併發生衝突時更改。 – Manikanta

1

由於您使用的斯威夫特,名稱不同而已。而不是NSMergeByPropertyObjectTrumpMergePolicy,你應該使用NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType。使用Swift時,使用不同的名稱也是一樣的。