将两个 JSON 文件中的数据写入具有关系的核心数据模型

Posted

技术标签:

【中文标题】将两个 JSON 文件中的数据写入具有关系的核心数据模型【英文标题】:writing data from two JSON files into core data model with relation 【发布时间】:2011-08-25 16:01:10 【问题描述】:

在我的应用程序中,它包含一个用户列表,其中包含一个与办公室相关的字段,我从远程服务器加载了两个 JSON 文件。一个包含用户的文件,一个包含办公室的文件。

我的核心数据模型包含两个实体:用户和办公室。它们相互关联。在用户中有一个名为 office 的关系。到目前为止一切顺利。

但现在我必须填写实体用户中的字段,效果很好。清单已经在那里了。美好的!但是当用来自 JSON 的数据填充实体 User 时,我必须从 Office 实体中获取适当的 managedObject 以将其传递给 User 实体中的 User 项。

我已经在 User 类中定义了 office 属性

@property (nonatomic, retain) NSManagedObject *office;

但让我头疼的是我只有一个在 appDelegate 中定义的 managedObjectContext。我将 managedObjectContext 传递给 ListViewController。见下文:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions


    NSManagedObjectContext *context = [self managedObjectContext];

    if (!context) 
        // Handle the error.
    
    // Pass the managed object context to the view controller.
    listViewController.managedObjectContextUser = context;

    // Override point for customization after application launch.
    // Add the tab bar controller's current view as a subview of the window
    self.window.rootViewController = self.tabBarController;

    [self.window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque animated:NO];  
    return YES;

但如果我尝试访问我之前在标题中声明的 Office 的第二个 managedObject,则会引发异常:

- (void)updateUsers

    NSString *users = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:kUsersFilePath]];
    if ([users length] == 0)
    
        NSLog(@"usersList is == 0");
        [users release];
        return;
    

    SBJsonParser *parser = [[SBJsonParser alloc] init];
    usersObject = [[parser objectWithString:users error:nil] copy];
    usersList = [usersObject objectForKey:kUsersDataName];
    [parser release];

    User *user = (User *)[NSEntityDescription entityForName:@"User" inManagedObjectContext:managedObjectContextUser];
    NSError *error = nil;

    Office *office = (Office *)[NSEntityDescription entityForName:@"Office" inManagedObjectContext:managedObjectContextOffice];
    NSLog(@"managedObjectContextOffice: %@", office);

我的问题是我是否必须在我的 appDelegate 中创建第二个 managedObjectContext。一个用于用户,一个用于 Office?

或者有没有一种方法可以让我在 ListViewController 中只使用一个 managedObjectContext 从两个不同的实体中获取对象?

【问题讨论】:

【参考方案1】:

当然,managedObjectContext 指的是整个数据模型,因此您可以在该上下文中对您的实体执行任何操作。

读入新的UserOffice 对象后,尝试通过将其插入managedObjectContext 来实际创建一个新对象

User *user = [NSEntityDescription 
             insertNewObjectForEntityForName:@"User" 
             inManagedObjectContext:self.managedObjectContext];

使用类中自动生成的方法将办公对象附加到用户,反之亦然。

【讨论】:

我已经这样做了。问题是我有两个不同的 NSEntityDescription 都与一个 managedObjectContext 相关。它没有用。用户的 manageduserContext 被 office 的 managedObjectContext 覆盖。所以我将 managedObjectContext 加倍为 managedObjectContextOffice 和 managedObjectContextUser。无论如何,它们指向我的 appDelegate 中的同一个 managedContext。奇怪,但现在可以了。

以上是关于将两个 JSON 文件中的数据写入具有关系的核心数据模型的主要内容,如果未能解决你的问题,请参考以下文章

将对象添加到具有多对多关系的核心数据中的 NSSet

将输出映射到 Restkit 中的核心数据时崩溃

从核心数据创建 json 字符串,反之亦然?

Node.js的Buffer写入

加快将大量 JSON 数据写入磁盘的速度

如何将 JSON 结构化数据写入 Python 中的文本文件?