CoreData多个持久性存储协调器?

时间:2015-11-07 01:53:25

标签: ios objective-c core-data

我无法完全掌握CoreData术语。

我为两个概念上独立的数据集创建了两个.xcdatamodeld个文件。

一个是关于缓存我从网上下载的静态数据 一个是关于用户编写但尚未提交给服务器的临时帖子。

这两个数据集根本不需要彼此了解。

当我尝试更新任何一个设置时,我想要一个让我最头疼的设置。

我需要两个单独的persistent store coordinator吗?还是两个单独的persistent store?那到底是什么意思呢?

**编辑

我猜Mundi建议如下。

1 coordinator --- store1 --- model1
      \
       \
         ----- store2 --- model2

我如何在代码中实现这一目标?

我有以下代码(从教程网站复制),结构更像或更像

psc --- model1
  \
   \
     --- store1

而不是

psc --- model1 --- store1

我现有的代码看起来像..

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CachedURLResponse" withExtension:@"momd"];

_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"test.sqlite"];
NSError *error = nil;
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]

如何在一个协调器中实现模型的单独存储?

我可以在RDMS世界中为每个模型使用单独的表。我以后可以更新表定义,并像我有两个单独的数据库一样轻松地迁移数据。

我不确定在一个数据库中更新不同的表(模型)会有多容易。

3 个答案:

答案 0 :(得分:2)

我不会进入设置不同商店协调员和上下文的架构复杂性,而是创建两个不同的商店和不同的实体,以确保两个数据集不会相互干扰。

这会满足您对“最不耐烦”的要求,同时让您使用普通的香草代码。

多个商店和模型的基本程序如下:

  • 在模型中,将您的实体包含在“配置”中,为两个商店使用不同的名称。
  • 在设置Core Data堆栈时,合并模型
  • 而不是仅将一个持久性存储添加到配置为nil的协调器中,而是添加两个具有相应配置名称的存储。

答案 1 :(得分:1)

从概念上讲,持久性存储类似于数据库;它是一个存储符合某种模式的数据的地方。持久性存储协调器管理对一个或多个持久性存储的读取和写入。

如何构建CoreData堆栈可能取决于您想要查询数据的方式。

如果这两个数据集完全不同,您可以为每个数据集提供自己的存储和协调器以及托管对象上下文。但是,在这种情况下,您将无法为“所有已保存或未保存的帖子”构建查询(通过NSFetchRequest),您可能需要做一些额外的工作来跟踪帖子何时从一个状态到另一个状态,以确保您不会在两个商店中存储相同帖子的版本。

如果您确实需要跨两组数据进行查询,那么您需要一个协调器来管理每个商店中保存的实体。这需要你在协调员中做一些工作,但可能允许应用程序的其余部分不知道这些持久存储的机制。

您需要确定哪种路径更易于使用和维护。

答案 2 :(得分:0)

如果您想要合并模型,可以在代码中完成,而无需更改模型文件。

假设有两个模型,“CachedURLResponse”和“TemporaryPosts”,你想要一个包含每个模型中所有实体的独立商店,你可以这样做。

- (NSString*)configurationForModelNamed:(NSString*)modelName {
    return [modelName stringByAppendingString:@".config"];
}

- (NSURL*)URLForModelNamed:(NSString*)modelName {
    NSString *name = [modelName stringByAppendingString:@".sqlite"];
    return [[self applicationDocumentsDirectory] URLByAppendingPathComponent:name];
}

- (NSManagedObjectModel*)mergedModelForModelNames:(NSArray*)modelNames {
    NSMutableArray *models = [[NSMutableArray alloc] init];
    for (NSString * name in modelNames) {
        NSURL *modelURL = [[NSBundle mainBundle] URLForResource:name withExtension:@"momd"];
        NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
        [model setEntities:model.entities forConfiguration:[self configurationForModelNamed:name]];
        [models addObject:model];
    }
    return [NSManagedObjectModel modelByMergingModels:models];
}

- (NSPersistentStoreCoordinator*)pscForModelNames:(NSArray*)modelNames {
    NSManagedObjectModel *model = [self mergedModelForModelNames:modelNames];
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    for (NSString *name in modelNames) {
        NSError *error = nil;
        if (![psc addPersistentStoreWithType:NSSQLiteStoreType
                               configuration:[self configurationForModelNamed:name]
                                         URL:[self URLForModelNamed:name]
                                     options:nil
                                       error:&error]) {
            // Handle error...
        }
    }
}

然后,您可以使用您想要的任何模型创建PSC ...

NSPersistentStoreCoordinator *psc = [self pscForModelNames:@[@"CachedURLResponse", @"TemporaryPosts"]];