JSON 到核心数据 SQLITE 错误
Posted
技术标签:
【中文标题】JSON 到核心数据 SQLITE 错误【英文标题】:JSON to Core Data SQLITE Error 【发布时间】:2013-08-14 02:46:43 【问题描述】:谁能帮助找出我在这段代码中做错了什么?尝试通过 JSON 文件填充核心数据结构
// Create the managed object context
NSManagedObjectContext *context = managedObjectContext();
// Save the managed object context
NSError *error = nil;
if (![context save:&error])
NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
exit(1);
NSError* err = nil;
NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Exercises" ofType:@"json"];
NSArray* Exercises = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
options:kNilOptions
error:&err];
//NSLog(@"Imported Exercises: %@", Exercises);
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"Exercise" inManagedObjectContext:context];
NSString *theJSONString = @"\"key\":\"value\"";
NSError *theError = NULL;
NSDictionary *jsonDict = [NSDictionary dictionaryWithJSONString:theJSONString error:&theError];
Exercise *exercise = [NSEntityDescription insertNewObjectForEntityForName:@"Exercise"
inManagedObjectContext:context];
[Exercises enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
NSDictionary *attributes = [[object entity] attributesByName];
for (NSString *attribute in attributes)
id value = [jsonDict objectForKey:attribute];
if (value == nil)
continue;
[exercise setValue:value forKey:attribute];
NSError *error;
if (![context save:&error])
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
];
编辑: 代码现在可以编译,但我在核心数据模型中得到空值。 谢谢
【问题讨论】:
在这段代码中你实际上并没有保存任何东西。保存调用什么也不做。提供 JSON 数据值的 Entity 子类在哪里? 【参考方案1】:首先,这不是 SQLite 错误,而是标准的基本 Objective-C 错误。即使您没有使用基于 SQLite 的核心数据存储,您也会遇到同样的问题。
让我们从看起来错误发生的地方向后工作,即:
NSDictionary *attributes = [[obj entity] attributesByName];
您在obj
上致电entity
。但是obj
是从哪里来的呢?从这里开始:
[Exercises enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
好的,所以obj
来自Exercises
。 Exercises
中有什么内容?
NSArray* Exercises = [NSJSONSerialization
JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
options:kNilOptions
error:&err];
Exercises
是NSJSONSerialization
给你的一系列东西。 JSONObjectWithData:options:error:
方法为您提供 JSON 内容的 Cocoa 等效项。 它不会为您提供托管对象。在这种情况下,您的 JSON 似乎生成了一个 NSDictionary
数组。
所以发生了什么:
-
您使用了
NSJSONSerialization
并获得了一系列字典
您遍历了该数组
您试图在数组成员上调用entity
,只有数组成员是NSDictionary
实例,并且该类没有实现entity
。
您的代码永远不会在任何地方创建任何 Core Data 对象。这就是为什么你没有得到任何核心数据对象。您的代码正在崩溃,因为您试图在未实现这些方法的对象上调用 Core Data 方法。
【讨论】:
嗨,Tom,感谢您的回复,我第一次使用“丑陋/粗糙”的方式使用 JSON 填充核心数据。正如你在可可的帖子上所说的那样,是我的女朋友。然后我尝试对我拥有的原始代码实施 NSDictionary 方式。我将如何创建一个可以与带有 touchJSON 的 NSDictionary 类别一起使用的核心数据对象“Exercises”。谢谢 使用标准方法之一创建托管对象,例如[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
。我在 CIMGF 上的帖子是关于如何将数据从 JSON 获取到托管对象,但您仍然需要先创建托管对象。
这个过程可以用于多个实体吗?和一对多的关系?
对于多个实例,您必须一次处理一对对象/JSON 字典,但您可以根据需要多次处理。你必须找到一些其他的方式来处理关系——无论如何,JSON 并没有一个标准。
感谢您的帮助,我设法编辑了允许它编译的代码,但是在检查了创建的 sqlite 数据库中的内容后,这些条目都是空的...以上是关于JSON 到核心数据 SQLITE 错误的主要内容,如果未能解决你的问题,请参考以下文章
NSBundle 中的 CoreData sqlite 文件
将 JSON 嵌套到核心数据和 ObjectForKey 错误
SwiftUI macOS 获取 json 错误 [logging] 卷不支持数据保护,剥离 SQLITE_OPEN_FILEPROTECTION_* 标志\