2016-01-17 44 views
0

我遇到了核心數據的謂詞方法問題,因爲它在返回的結果中似乎有點不一致。我有一個從Web API填充的「用戶」實體,而不是刪除所有條目,然後下載和添加用戶,我傾向於將所有用戶的標誌設置爲「isModified」爲false,然後通過API下載用戶並根據用戶是否在商店中更新或添加用戶,在添加/更新時設置「isModified」標誌。最後,代碼刪除沒有設置「isModified」標誌的用戶。我這樣做是因爲如果Web API不可用,我不會失去所有用戶,應用程序可以繼續工作。swift 2核心數據謂詞不一致

我遇到的問題是刪除未設置其「isModified」標誌的用戶的方法是刪除已更新的用戶!

這裏的方法:

func deleteUsersNotUpdated() -> Bool { 
    // default result 
    var result = false 

    // setup the fetch request 
    let fetchRequest = NSFetchRequest(entityName: "Users") 

    // set a predicate that filters only records with updated set to false 
    fetchRequest.predicate = NSPredicate(format: "isModified == %@", false) 

    do { 
    let fetchResults = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [NSManagedObject] 
    for user in fetchResults { 
     print("Deleting \(user)") 
     self.managedObjectContext.deleteObject(user) 
     try self.managedObjectContext.save() 
    } 
    result = true 
    } catch let error as NSError { 
    print("\(error)") 
    } 
    return result 
} 

的方法大多是工作,但間歇性地將刪除用戶沒有很好的理由,即即使它有「isModified」標誌設置,例如這裏是該行的輸出:打印(「刪除(用戶)」)

Deleting <NSManagedObject: 0x7b6d6ec0> (entity: Users; id: 0x7b64abd0 <x-coredata://1A7606EB-3539-4E85-BE1C-15C722AD7125/Users/p14> ; data: { 
    created = "2016-01-17 16:54:21 +0000"; 
    familyName = Doe; 
    givenName = John; 
    isModified = 1; 
    pin = 3932; 
    type = STAFF; 
}) 

正如你所看到的,「isModified」標誌十分肯定地設置,但謂語應該只選擇有記錄標誌重置(false)。

上面的方法是我創建的類的一部分,它基本上是Users實體的CRUD類。

抓我的頭在這裏! 如果需要,我可以提供其餘的代碼。

回答

2

我認爲你的代碼看起來非常好(雖然你應該保存在循環外)。在大多數情況下,Swift布爾值自動轉換爲NSNumber。有很多有效的方法來編寫這個謂詞。

想到的唯一可能的解釋是另一個類正在使用相同的託管對象上下文來修改提取的對象。如果你有一個單一的上下文應用程序這是一個可以想象的場景。

避免這種情況的標準方法是在背景上下文中進行更改。

+0

近足以給出線索,使我能夠解決問題:-)在從Web API抓取數據的dataTaskWithUrl方法的關閉中,我需要在dispatch_async(dispatch_get_main_queue()中包裝「保存數據到核心數據」代碼),{<保存到核心數據在這裏>}) - 謝謝! – Paul

0

使用一個布爾值,而不是對象佔位符%@布爾

NSPredicate(format: "isModified == FALSE") 

,並在重複循環的每個迭代不叫context.save(),重複循環後調用一次。

+0

是的,試過了,沒有區別。僅供參考,大約有20條記錄,每次運行應用時,其中一條可能會被刪除,有時甚至一條也沒有,每次都是隨機記錄,根本不一致。 – Paul

+0

我用第二個建議更新了答案。 – vadian

+0

我也試過了! – Paul