多个数据模型的多个对象上下文?

时间:2014-06-19 16:16:47

标签: ios iphone objective-c core-data ios7

我的应用程序中定义了三个DataModel。我的问题是,如果我需要三种不同的背景?那么三个不同的sqlite文件?

每次我将记录保存到我的数据库中时,我都会执行以下操作:

managedObjectContext = [[AppDelegate sharedAppDelegate] getManagedObjectContextWithDB:@"TestDB.sqlite"];

或者,如果我将记录保存到我的其他DataModel中,我会这样做:

managedObjectContext = [[AppDelegate sharedAppDelegate] getManagedObjectContextWithDB:@"TestDB2.sqlite"];

那是正确的方法吗?或者我必须只为所有三个模型设置一个上下文?

以下是其他方法:

- (NSManagedObjectContext *)getManagedObjectContextWithDB:(NSString *)db
{
if (_managedObjectContext != nil) {
    return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinatorWithDB:db];
if (coordinator != nil) {
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator: coordinator];
}

return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
    return _managedObjectModel;
}
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];

return _managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinatorWithDB:(NSString *)db {
if (_persistentStoreCoordinator != nil) {
    return _persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory]
                                           stringByAppendingPathComponent: db]];

NSDictionary *options = @{
                          NSMigratePersistentStoresAutomaticallyOption : @YES,
                          NSInferMappingModelAutomaticallyOption : @YES
                          };
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc]
                               initWithManagedObjectModel:[self managedObjectModel]];
if(![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                              configuration:nil URL:storeUrl options:options error:&error]) {
    /*Error for store creation should be handled in here*/
}

return _persistentStoreCoordinator;
}

1 个答案:

答案 0 :(得分:1)

如果按数据模型表示包含实体及其关系的模型文件(文件扩展名为.xcdatamodel),那么我认为答案是肯定的。要与数据模型交互,请设置持久性存储协调器并使用模型对其进行实例化(如您所做)。要与托管对象进行交互,您需要创建托管对象上下文(您也已完成)。由于这是不可能的,我将假设您只有一个模型文件,而是从该模型派生出3个单独的商店。

由于您有兴趣建立与同一型号相对应的多个商店,例如,如果您预先填充了一个默认数据存储,然后是用户填充的商店,这是完全可能的。您需要做的就是在协调员上再次呼叫addPersistentStoreWithType:configuration:。这里有很多SO帖子,所以我不太深入。

您需要考虑的一件事是,设置多个商店确实意味着您需要非常仔细地观察您的表现(毕竟您在移动设备上)。也就是说,您不需要管理三种不同的上下文,您只需要确保将商店添加到上下文与之通信的同一持久性存储协调器中。协调员将完成所有工作,以确定要读取和写入的商店。

我希望这有帮助!


修改

在评论之后,人们发现原始问题的确围绕着维护单独的托管对象模型文件,从而将持久性存储协调器分开。 OP实际上在上下文中有关于这些实体的更新和插入的问题。然后我们意识到问题可能是MO在其上下文之外被访问的事实,因此该问题的解决方案涉及在[NSManagedObjectContext performBlock:]方法中将所有更新包装到MO中。这为我们提供了一种访问MO的线程安全方法。

需要注意的是,设置三个独立的模型是一个相当复杂的解决方案,在大多数情况下可能实际上并不是必需的。拥有单独的模型意味着无法与其他模型中的实体建立任何关系。我对初学者的建议是使用一个模型文件,如果拥有单独的商店真的很重要,你总是可以使用[NSManagedObjectModel mergedModelFromBundles:]方法创建单独的商店,同时仍然与同一个协调员交谈。在一天结束时,Core Data最强大的功能之一是它的关系管理,并在很多方面设置单独的模型限制。