尝试向 Core Data 添加新记录时出错

Posted

技术标签:

【中文标题】尝试向 Core Data 添加新记录时出错【英文标题】:Error when I try to add a new record to Core Data 【发布时间】:2015-11-03 08:28:02 【问题描述】:

我想将数据保存到 CoreData,但出现下一个错误:

Terminating app due to uncaught exception 'NSUnknownKeyException',
reason: '[<NSEntityDescription 0x7fc428f75940> setValue:forUndefinedKey:]: 
this class is not key value coding-compliant for the key username.'

这是我的代码:

let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context: NSManagedObjectContext = appDelegate.managedObjectContext

    let request: NSFetchRequest = NSFetchRequest(entityName: "UnreadMessages")
    request.returnsObjectsAsFaults = false

    do 
        let result: NSArray = try context.executeFetchRequest(request)
        let newRecord: NSEntityDescription = NSEntityDescription.entityForName("UnreadMessages", inManagedObjectContext: context)!

        if result.count > 0 
            print("It exists")
            print(context)
         else 
            print("it's a new record")
            newRecord.setValue(user.jidStr, forKey: "username")
            newRecord.setValue("1", forKey: "count")

            do 
                try context.save()
             catch let error 
                print(error)
            
            print(context)
        
     catch _ 

    

直到:

print("it's a new record")
newRecord.setValue(user.jidStr, forKey: "username")

打印It's a new record 并崩溃!我的代码有什么问题?

这是我的 CoreData 截图:

【问题讨论】:

【参考方案1】:

由于未捕获的异常“NSUnknownKeyException”而终止应用程序, 原因: '[ setValue:forUndefinedKey:]:这个类不是键值 密钥用户名的编码兼容。'

这是你的大线索。这意味着您要求 NSEntityDescription 的实例使用 KVC 设置名称为“用户名”的属性,但该类不支持该键。

prints 这是一个新的记录并且崩溃了!我的代码有什么问题?

好吧,您的代码不会创建新的“记录”。这段代码

let newRecord: NSEntityDescription = NSEntityDescription.entityForName("UnreadMessages", inManagedObjectContext: context)!

创建一个NSEntityDescription,可用于创建NSManagedObject

创建一个你想调用的新“记录”

let newRecord = NSEntityDescription.insertNewObjectForEntityForName(
                    "UnreadMessages",
                    inManagedObjectContext:context)

因此,您现在可以看到您正在尝试在实体描述而不是托管对象上设置“用户名”。

【讨论】:

它似乎有效,但如果它存在呢?我可以在这里搜索select count where username = some_name_here吗? @OrkhanAlizade - 虽然下面可能有一个 SQL 数据库,但核心数据不是数据库,所以你不会发出 SQL 语句。您只需询问持久存储是否有您的对象的实例。在核心数据中,这称为 fetch,您可以通过阅读 NSFetchRequest 上的文档了解所有相关信息。基本上,您通过某个键获取,如果对象存在,则更新它,如果不存在,则创建一个新对象。【参考方案2】:

我认为,如果您没有找到匹配的记录,您需要先将类似这样的内容插入到托管对象上下文中......

   do 
    let result: NSArray = try context.executeFetchRequest(request)
    if result.count > 0 
        // NEW CODE: Print the username if found in result[0]                         
        let userFound = result[0]                                                 
        let usernamefound = String(userFound.valueForKey("username")!)            
        print("It exists  \(usernameFound)")                                      

        print(context)
     else 
        print("it's a new record")

        let newRecordEntity: NSEntityDescription = NSEntityDescription.entityForName("UnreadMessages", inManagedObjectContext: context)!
        let newRecord = UnreadMessages(entity: newRecordEntity!, insertIntoManagedObjectContext: context)

        newRecord.setValue(user.jidStr, forKey: "username")
        newRecord.setValue("1", forKey: "count")

        do 
            try context.save()
         catch let error 
            print(error)
        

【讨论】:

我可以在这里搜索select count where username = some_name_here吗? 您好,如果您只想获取给定用户名的记录,您需要使用 NSPREDICATE。如果您有多个条件,那么您需要一个复合谓词。我用一个使用用户名 = some_username 的谓词的示例更新了上面的答案 谢谢!但它返回给我Use of unresolved identifier 'UnreadMessages'这个错误 崩溃在哪一行?今天我面前没有mac,所以我无法调试它。如果是“let newRecord = UnreadMessages ...”行,请尝试上面乔迪回答中的示例。 是的,我已经这样做了。最后一个问题,我获取了请求并得到了&lt;NSManagedObject: 0x7fd7406992e0&gt; (entity: UnreadMessages; id: 0xd000000000040014 &lt;x-coredata://7EA53B7F-37BF-4FF3-B02E-629BEC62260E/UnreadMessages/p1&gt; ; data: count = 1; username = "Bob"; )。我怎样才能从这里只打印用户名?

以上是关于尝试向 Core Data 添加新记录时出错的主要内容,如果未能解决你的问题,请参考以下文章

Swift Core Data - 使用 NSManagedObject 子类访问获取的实体时出错

从csv读取后使用powershell向vm添加标签时出错

尝试将记录添加到具有先前创建的记录的表时出错

在 asp.net core 中插入/更新记录时出错

EF Core - 添加相关实体时出错

将 `lastModified` 记录添加到 Core Data 托管对象