Ios 尝试向核心数据添加新记录时出错

Ios 尝试向核心数据添加新记录时出错,ios,iphone,swift,core-data,Ios,Iphone,Swift,Core Data,我想将数据保存到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.' 直至: p

我想将数据保存到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.'
直至:

print("it's a new record")
newRecord.setValue(user.jidStr, forKey: "username")
打印
这是一条新记录
并崩溃!我的代码有什么问题

这是我的CoreData屏幕截图:


我认为,如果找不到匹配的记录,则需要首先将类似以下内容插入到托管对象上下文中

   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)
        }

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

   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)
        }
由于未捕获异常“NSUnknownKeyException”而终止应用程序, 理由:'[ setValue:forUndefinedKey::此类不是键值 符合密钥用户名的编码要求。'

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

打印这是一张新唱片,然后崩溃了!我的代码有什么问题

您的代码不会创建新的“记录”。此代码

let newRecord: NSEntityDescription = NSEntityDescription.entityForName("UnreadMessages", inManagedObjectContext: context)!
创建
NSEntityDescription
,可用于创建
NSManagedObject

创建要调用的新“记录”

let newRecord = NSEntityDescription.insertNewObjectForEntityForName(
                    "UnreadMessages",
                    inManagedObjectContext:context)
因此,您现在可以看到您正试图在实体描述上设置“username”,而不是在托管对象上设置“username”

由于未捕获异常“NSUnknownKeyException”而终止应用程序, 理由:'[ setValue:forUndefinedKey::此类不是键值 符合密钥用户名的编码要求。'

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

打印这是一张新唱片,然后崩溃了!我的代码有什么问题

您的代码不会创建新的“记录”。此代码

let newRecord: NSEntityDescription = NSEntityDescription.entityForName("UnreadMessages", inManagedObjectContext: context)!
创建
NSEntityDescription
,可用于创建
NSManagedObject

创建要调用的新“记录”

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

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

这似乎可行,但如果它存在呢?我可以在这里搜索吗,比如
select count where username=some\u name\u here
?@OrkhanAlizade-虽然下面可能有一个SQL数据库,但核心数据不是数据库,所以您不需要发出SQL语句。您只需询问持久存储是否有对象的实例。在核心数据中,这称为获取,您可以通过阅读
NSFetchRequest
上的文档来了解它的全部内容。基本上,你通过某个键来获取,如果对象在那里,你就更新它,如果没有,你就创建一个新的。这似乎是可行的,但是如果它在那里呢?我可以在这里搜索吗,比如
select count where username=some\u name\u here
?@OrkhanAlizade-虽然下面可能有一个SQL数据库,但核心数据不是数据库,所以您不需要发出SQL语句。您只需询问持久存储是否有对象的实例。在核心数据中,这称为获取,您可以通过阅读
NSFetchRequest
上的文档来了解它的全部内容。基本上,您可以通过某个键获取,如果对象在那里,您可以更新它,如果没有,您可以创建一个新的。我可以在这里像
select count where username=some\u name\u here
?您好,如果您只想获取给定用户名的记录,您需要使用NSPREDICATE。如果有多个条件,则需要一个复合谓词。我用一个例子更新了上面的答案,其中使用了username=some\u username的谓词谢谢!但它返回我使用未解析标识符“UnreadMessages”的
此错误它在哪一行崩溃?今天我面前没有mac电脑,所以我无法调试它。如果是“let newRecord=UnreadMessages…”行,请尝试上面Jody答案中的示例。是的,我已经做过了。最后一个问题,我获取了请求并获取了
(实体:UnreadMessages;id:0xd00000000040014;数据:{count=1;username=“Bob”})
。如何从此处仅打印用户名?我是否可以在此处搜索,如
选择count where username=some\u name\u here
?您好,如果您只想获取给定用户名的记录,则需要使用NSPREDICATE。如果有多个条件,则需要一个复合谓词。我用一个例子更新了上面的答案,其中使用了username=some\u username的谓词谢谢!但它返回我使用未解析标识符“UnreadMessages”的
此错误它在哪一行崩溃?今天我面前没有mac电脑,所以我无法调试它。如果是“let newRecord=UnreadMessages…”行,请尝试上面Jody答案中的示例。是的,我已经做过了。最后一个问题,我获取了请求并获取了
(实体:UnreadMessages;id:0xd00000000040014;数据:{count=1;username=“Bob”})
。如何从这里打印用户名?