ios - JSON 到核心数据 SQLITE 错误

标签 ios json sqlite core-data

任何人都可以帮助找出我在这段代码中做错了什么吗?尝试通过 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];

ExercisesNSJSONSerialization 为您提供的一组内容。 JSONObjectWithData:options:error: 方法为您提供了 JSON 内容的 Cocoa 等价物。 它不会为您提供托管对象。在这种情况下,您的 JSON 似乎生成了一个 NSDictionary 数组。

所以发生的事情是:

  1. 你使用了 NSJSONSerialization 并得到了一个字典数组
  2. 您迭代了该数组
  3. 您尝试对数组成员调用 entity,只有数组成员是 NSDictionary 实例,并且该类未实现 entity >.

您的代码永远不会在任何地方创建任何核心数据对象。这就是为什么您没有获得任何核心数据对象的原因。您的代码正在崩溃,因为您试图在未实现这些方法的对象上调用核心数据方法。

关于ios - JSON 到核心数据 SQLITE 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18222407/

相关文章:

ios - Nib IBOutlet 导致应用程序崩溃

iphone - NSPredicate 与 NSCompoundPredicate?

php - 为什么使用 json 的 javascript 库选择 [ { } , { } ] 结构

java - results.next() == false 并且没有打印数据

sql - 序列化还是 SQlite?

ios - Swift:Tumblr 是否在 UIScrollView 中添加了 UICollectionView?

php - XML 中的 CDATA 中的 JSON - 适用于本地主机 (WAMP),但不适用于主机 (LINUX)

php - Android UTF-8 西里尔文请求

android - 何时在 Android 上使用本地存储,推荐使用哪个?

ios - 如何在用户选择时在 uitabbarcontroller 内部的 uinavigationcontroller 中每次初始化 viewcontroller