gpt4 book ai didi

ios - 多个数据模型的多个 ObjectContext?

转载 作者:行者123 更新时间:2023-11-29 02:52:42 26 4
gpt4 key购买 nike

我在我的应用程序中定义了三个数据模型。我的问题是,如果我需要三种不同的上下文?那么三个不同的 sqlite 文件?

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

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

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

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;
}

最佳答案

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

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

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

希望对您有所帮助!


编辑

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

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

关于ios - 多个数据模型的多个 ObjectContext?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24311472/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com