如何解决CoreData:此类与密钥文件夹的密钥值编码不兼容
已更新-带有以下解决方案的代码
我已经在许多不同的项目上使用CoreData了,但没有遇到任何问题,但是我很困惑。此项目与以前的项目唯一的区别是我正在使用CloudKit。
我要做的就是为当前记录设置一个值。我有一个名为Folders的实体,在该实体中有一个名为folderPosition的属性,它是一个Int16。
我更新值的代码如下:
static func updateFolderPositionsAfterFolderDeletion(managedObjectContext: NSManagedObjectContext = AppDelegate.viewContext) {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Folders")
let sortDescriptor = NSSortDescriptor(key: "folderPosition",ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
do {
if let fetchResults = try managedObjectContext.fetch(fetchRequest) as? [Folders] {
if fetchResults.count != 0 {
for items in fetchResults {
managedObjectContext.setValue(items.folderPosition - 1,forKey: "folderPosition")
}
}
}
try? managedObjectContext.save()
}
catch {
print("Catch")
}
}
但是我仍然遇到以下错误:
quotelibc ++ abi.dylib:以类型为NSException的未捕获异常终止 ***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[
的未捕获异常终止setValue:forUndefinedKey:]:此类与密钥folderPosition的编码都不兼容。 以类型为NSExceptionquote>
另一个奇怪的是,我有一个名为folderName(String)的属性,如果我使用相同的代码进行更新,则不会崩溃,并且可以看到它遍历了CoreData中所有可用的文件夹并更新了folderName的值但是当我取回数据时,文件夹名称没有更改。都很奇怪。
基于有用的评论和答案的更新代码-谢谢!
static func updateFolderPositionsAfterFolderDeletion(managedObjectContext: NSManagedObjectContext = AppDelegate.viewContext) {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Folders")
let sortDescriptor = NSSortDescriptor(key: "folderPosition",ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
do {
if let fetchResults = try managedObjectContext.fetch(fetchRequest) as? [Folders] {
for (index,folder) in fetchResults.enumerated() {
folder.folderPosition = (Int16(index))
}
}
try? managedObjectContext.save()
}
catch {
print(error)
}
}
解决方法
首先,与该问题无关的重新建立位置索引的逻辑看起来很奇怪。实际上,您只需要从位置已删除位置+ 1 处的项目减少索引。
如评论中所述,错误是由错字引起的。你是说
items.setValue(items.folderPosition - 1,forKey: "folderPosition")
代替
managedObjectContext.setValue(items.folderPosition - 1,forKey: "folderPosition")
代码中有许多不良做法。
- 命名令人困惑。以单数形式命名实体和循环元素:
Folder
和for item in ...
。 - 避免冗余信息。将
folderPosition
重命名为position
- 在KVC上更喜欢点符号。
- 利用通用提取请求:
NSFetchRequest<Folders>
。 - 请勿使用
count == 0
检查空字符串或空数组。有isEmpty
。 - 空支票还是多余的。如果数组为空,则跳过循环。
- 切勿在{{1}}块中打印无意义的文字字符串。打印
catch
。
error
要重新索引从0开始的整个数据集,有一种更聪明的方法:
static func updateFolderPositionsAfterFolderDeletion(managedObjectContext: NSManagedObjectContext = AppDelegate.viewContext) {
let fetchRequest = NSFetchRequest<Folders>(entityName: "Folders")
let sortDescriptor = NSSortDescriptor(key: "folderPosition",ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
do {
let folders = try managedObjectContext.fetch(fetchRequest)
for folder in folders {
folder.folderPosition = folder.folderPosition - 1
}
try managedObjectContext.save()
}
catch {
print(error)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。