Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift CoreData:此类不符合key folderPosition的键值编码_Swift_Core Data_Key Value Coding - Fatal编程技术网

Swift CoreData:此类不符合key folderPosition的键值编码

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

已更新-使用下面的解决方案编码

我在许多不同的项目中使用了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")
    }
}
静态函数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
}