尝试向 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 ...”行,请尝试上面乔迪回答中的示例。
是的,我已经这样做了。最后一个问题,我获取了请求并得到了<NSManagedObject: 0x7fd7406992e0> (entity: UnreadMessages; id: 0xd000000000040014 <x-coredata://7EA53B7F-37BF-4FF3-B02E-629BEC62260E/UnreadMessages/p1> ; data: count = 1; username = "Bob"; )
。我怎样才能从这里只打印用户名?以上是关于尝试向 Core Data 添加新记录时出错的主要内容,如果未能解决你的问题,请参考以下文章