將項目更新爲最新的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的,和它的作品,但如果它是唯一的解決方案,我不得不更新大量的代碼。
任何建議爲什麼這不起作用?
這不太可能,在該代碼中發生錯誤(沒有字典參與)。順便說一句:如果獲取成功,結果保證爲'[LevelEntity]',您可以安全地使用'as!'和'if(results?.count)! > 0 {'可以用'if results.isEmpty {'替換。 PS:在Swift 3中,獲取請求應該使用'let requestSavedLevel創建:NSFetchRequest = LevelEntity.fetchRequest()' –
vadian
1)試圖用LevelEntity.fetchRequest()更改requestSavedLevel的聲明,現在它甚至不是初始化。 2)我有一個與嘗試context.fetch行的斷點,如果我去下一步它需要我的AppDelegate。 – Alex
類方法'fetchRequest()'必須在'NSManagedObject'子類 – vadian