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

时间:2011-08-25 16:01:11

标签: objective-c ios core-data nsmanagedobject nsmanagedobjectcontext

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

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

但是现在我必须填写实体User中的字段才能很好用。清单已经存在。精细!但是当使用来自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的托管对象,它会引发异常:

- (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 个答案:

答案 0 :(得分:1)

当然,managedObjectContext指的是整个数据模型,因此您可以使用该上下文对您的实体执行所有操作。

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

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

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