将两个 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
指的是整个数据模型,因此您可以在该上下文中对您的实体执行任何操作。
读入新的User
或Office
对象后,尝试通过将其插入managedObjectContext
来实际创建一个新对象:
User *user = [NSEntityDescription
insertNewObjectForEntityForName:@"User"
inManagedObjectContext:self.managedObjectContext];
使用类中自动生成的方法将办公对象附加到用户,反之亦然。
【讨论】:
我已经这样做了。问题是我有两个不同的 NSEntityDescription 都与一个 managedObjectContext 相关。它没有用。用户的 manageduserContext 被 office 的 managedObjectContext 覆盖。所以我将 managedObjectContext 加倍为 managedObjectContextOffice 和 managedObjectContextUser。无论如何,它们指向我的 appDelegate 中的同一个 managedContext。奇怪,但现在可以了。以上是关于将两个 JSON 文件中的数据写入具有关系的核心数据模型的主要内容,如果未能解决你的问题,请参考以下文章