Swift CoreData:此类不符合key folderPosition的键值编码
已更新-使用下面的解决方案编码 我在许多不同的项目中使用了CoreData,但这一个问题让我感到困惑。这个项目和以前项目的唯一区别是我使用的是CloudKit 我所要做的就是为当前记录设置一个值。我有一个名为Folders的实体,该实体中有一个名为folderPosition的属性,它是一个Int16 我更新该值的代码如下所示:Swift CoreData:此类不符合key folderPosition的键值编码,swift,core-data,key-value-coding,Swift,Core Data,Key Value Coding,已更新-使用下面的解决方案编码 我在许多不同的项目中使用了CoreData,但这一个问题让我感到困惑。这个项目和以前项目的唯一区别是我使用的是CloudKit 我所要做的就是为当前记录设置一个值。我有一个名为Folders的实体,该实体中有一个名为folderPosition的属性,它是一个Int16 我更新该值的代码如下所示: static func updateFolderPositionsAfterFolderDeletion(managedObjectContext: NSManaged
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")
}
}
静态函数updateFolderPositionSafterFolderDelete(managedObjectContext:NSManagedObjectContext=AppDelegate.viewContext){
let fetchRequest=NSFetchRequest(entityName:“文件夹”)
让sortDescriptor=NSSortDescriptor(键:“folderPosition”,升序:true)
fetchRequest.sortDescriptors=[sortDescriptor]
做{
如果让fetchResults=尝试managedObjectContext.fetch(fetchRequest)作为?[文件夹]{
如果fetchResults.count!=0{
对于fetchResults中的项目{
managedObjectContext.setValue(items.folderPosition-1,forKey:“folderPosition”)
}
}
}
尝试?managedObjectContext.save()
}
抓住{
打印(“捕获”)
}
}
但是,我不断得到以下错误:
quotelibc++abi.dylib:以NSException类型的未捕获异常终止
***由于未捕获的异常“NSUnknownKeyException”而终止应用程序,原因:“[setValue:forUndefinedKey:]:此类与key 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)
}
}
静态函数updateFolderPositionSafterFolderDelete(managedObjectContext:NSManagedObjectContext=AppDelegate.viewContext){
let fetchRequest=NSFetchRequest(entityName:“文件夹”)
让sortDescriptor=NSSortDescriptor(键:“folderPosition”,升序:true)
fetchRequest.sortDescriptors=[sortDescriptor]
做{
如果让fetchResults=尝试managedObjectContext.fetch(fetchRequest)作为?[文件夹]{
对于fetchResults.enumerated()中的(索引、文件夹){
folder.folderPosition=(Int16(索引))
}
}
尝试?managedObjectContext.save()
}
抓住{
打印(错误)
}
}
首先,与问题无关,重新编制位置索引的逻辑看起来很奇怪。实际上,您只需要从位置deleted position+1处的项中减少索引
如评论中所述,错误是由打字错误引起的。你是说
items.setValue(items.folderPosition - 1, forKey: "folderPosition")
而不是
managedObjectContext.setValue(items.folderPosition - 1, forKey: "folderPosition")
代码中有许多错误做法
- 命名很混乱。以单数形式命名实体和循环元素:
和文件夹
中的项
- 避免冗余信息。将
重命名为folderPosition
position
- 与KVC相比,更喜欢点表示法
- 利用通用获取请求:
NSFetchRequest
- 切勿检查计数=0的空字符串或空数组。有
是空的
- 空支票无论如何都是多余的。如果数组为空,则跳过循环
- 切勿在
块中打印无意义的文字字符串。打印catch
错误
为什么使用键值编码而不是直接访问属性?对于这种情况,问题非常明显,NSManagedObjectContext没有属性
folderPosition
,也许可以尝试在模型对象上设置它?;)这更强调了直接访问属性的优势,因此编译器可以直接告诉您是否有错误。谢谢@JoakimDanielson-这很有意义。我基本上认为我看不见树木,结果进行了一些复杂的虫子搜索!;-)谢谢@vadian-说实话,我想我会失去这个情节的!我完全忘了我在和一个NSManagedObject类一起工作……可能在兔子洞里呆得太久了,盯着我的机器。就其他提示而言,感谢它们是有意义的,我确实需要更加努力地改进我的代码。
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)
}
}
for (index, folder) in folders.enumerated() {
folder.folderPosition = index
}