2016-09-16 81 views
0

將項目更新爲最新的swift語法(Swift 3)後,執行CoreData獲取請求時出現錯誤。所以這個應用程序工作了很多個月,現在它已經壞掉了。CoreData NSFetchRequest錯誤Swift 3中的NSInvalidArgumentException

所以這就是我如何執行我的提取請求。

let requestSavedLevel = NSFetchRequest<NSFetchRequestResult>(entityName: "LevelEntity") 
let levelNamePredicate = NSPredicate(format: "levelName = %@", levelName) 
requestSavedLevel.predicate = levelNamePredicate 

    do { 
    let results = try userDataStack.context.fetch(requestSavedLevel) as? [LevelEntity] 
    if (results?.count)! > 0 { 
     self.savedLevel = results?.first! 

     return results?.first! 
    } 
    } 
    catch { 
     print("\n Error on \(#function): \(error)") 
    } 

該錯誤發生在一行

讓結果=嘗試userDataStack.context.fetch(requestSavedLevel)爲? [LevelEntity]

並立即帶我到AppDelegate中並且示出線程1:信號SIGABRT

控制檯打印出信息: *終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因: '* - [NSDictionary initWithObjects:forKeys:]:對象的數量(0)不同於鍵的數量(9)'

我不知道發生了什麼,爲什麼代碼不再工作。我在Swift 3中看到了有關CoreData問題的其他問題,但這並沒有幫助。

*編輯*

我試圖找到是什麼原因導致的錯誤,我發現旁邊。 我的NSManagedObject具有這些屬性 `擴展myEntity所{

@nonobjc public class func fetchRequest() -> NSFetchRequest<MyEntity> { 
    return NSFetchRequest<MyEntity>(entityName: "MyEntity"); 
} 

@NSManaged public var horizontal: NSObject? 
@NSManaged public var name: String? 
@NSManaged public var shapes: NSObject? 

} 

我要救下一個數據核心數據: VAR水平:[INT]] 變數名稱:字符串 VAR形狀:[INT:形狀]

而且我不喜歡這樣寫道:

let entity = NSEntityDescription.insertNewObject(forEntityName: "MyEntity", into: userDataStack.context) as! MyEntity 

    entity.name = name 
    entity.horizontal = horizontal as NSObject 
    entity.shapes = shapes as NSObject 

    userDataStack.saveContext() 

然而,當我嘗試保存的最後一部分是entity.shapes = shapes as NSObject發生錯誤

形狀是一個自定義類,NSObject的子類

因此,當我嘗試從Core Data獲取數據時,得到的結果是對象計數(0)與密鑰(9)'的計數不同。

再次,一切都很好工作了許多個月,直到我更新的項目斯威夫特3.

我試圖用NSArchiver存檔的形狀,然後將其分配給entity.shapes作爲NSObject的,和它的作品,但如果它是唯一的解決方案,我不得不更新大量的代碼。

任何建議爲什麼這不起作用?

+0

這不太可能,在該代碼中發生錯誤(沒有字典參與)。順便說一句:如果獲取成功,結果保證爲'[LevelEntity]',您可以安全地使用'as!'和'if(results?.count)! > 0 {'可以用'if results.isEmpty {'替換。 PS:在Swift 3中,獲取請求應該使用'let requestSavedLevel創建:NSFetchRequest = LevelEntity.fetchRequest()' – vadian

+0

1)試圖用LevelEntity.fetchRequest()更改requestSavedLevel的聲明,現在它甚至不是初始化。 2)我有一個與嘗試context.fetch行的斷點,如果我去下一步它需要我的AppDelegate。 – Alex

+0

類方法'fetchRequest()'必須在'NSManagedObject'子類 – vadian

回答

0

所以我解決了它。 問題在於解碼我的自定義NSObject子類。

aDecoder.decodeObject(forKey: "number") as? Int 

decodeObject沒有回我的整數值,但我發現,decodeInteger方法做的。

aDecoder.decodeInteger(forKey: "column") 

然而,decodeInteger方法有時會導致崩潰一樣,所以我結束了在未來條件:

var n = aDecoder.decodeObject(forKey: "number") as? Int 
if n == nil { 
    n = aDecoder.decodeInteger(forKey: "number") 
}