任何人都可以帮助找出我在这段代码中做错了什么吗?尝试通过 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]);
}
}];
编辑: 代码现在可以编译,但我在核心数据模型中得到空值。 谢谢
最佳答案
首先,这不是 SQLite 错误,而是标准的基本 Objective-C 错误。即使您没有使用基于 SQLite 的核心数据存储,也会遇到同样的问题。
让我们从错误发生的地方开始,即:
NSDictionary *attributes = [[obj entity] attributesByName];
您正在对 obj
调用entity
。但是 obj
从哪里来呢?从这里开始:
[Exercises enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
好的,所以 obj
来自练习
。 练习
中有什么内容?
NSArray* Exercises = [NSJSONSerialization
JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
options:kNilOptions
error:&err];
Exercises
是 NSJSONSerialization
为您提供的一组内容。 JSONObjectWithData:options:error:
方法为您提供了 JSON 内容的 Cocoa 等价物。 它不会为您提供托管对象。在这种情况下,您的 JSON 似乎生成了一个 NSDictionary
数组。
所以发生的事情是:
- 你使用了
NSJSONSerialization
并得到了一个字典数组 - 您迭代了该数组
- 您尝试对数组成员调用
entity
,只有数组成员是NSDictionary
实例,并且该类未实现entity
>.
您的代码永远不会在任何地方创建任何核心数据对象。这就是为什么您没有获得任何核心数据对象的原因。您的代码正在崩溃,因为您试图在未实现这些方法的对象上调用核心数据方法。
关于ios - JSON 到核心数据 SQLITE 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18222407/