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 来自ExercisesExercises 中有什么内容?

NSArray* Exercises = [NSJSONSerialization
    JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
    options:kNilOptions
    error:&err];

ExercisesNSJSONSerialization 给你的一系列东西。 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_* 标志\

核心数据不保存到 sqlite 数据库

核心数据不直接保存到 sqlite

使用核心数据将数据存储到 sqlite 表的问题