2015-11-07 43 views
1

我无法完全掌握CoreData的条款。CoreData多个持久性存储协调器?

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

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

这两个数据集根本不需要相互了解。

我想要一个安装程序,当我尝试更新任何一个时,最少会让我头痛。

我需要两个单独的persistent store coordinator吗?或两个单独的persistent store?什么意思呢?

**编辑

我猜蒙迪建议像下面这样。

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世界中为每个模型生活在不同的表格中。我稍后可以更新表格定义,并像我有两个单独的数据库一样容易地迁移数据。

我不知道在一个数据库中更新不同的表格(模型)是多么容易。

回答

1

概念上,持久性存储与数据库类似,这是存储符合某种模式的数据的地方。持久性商店协调员管理对一个或多个持久存储的读取和写入。

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

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

如果您确实需要跨两组数据进行查询,那么您需要一个协调器来管理每个存储中保存的实体。这要求你在协调员中做一些工作,但可能会让应用的其他部分对这些持久存储的机制一无所知。

你需要决定哪些路径将是您更容易使用和维护。

2

而不是进入设置不同的商店协调员和环境的建筑的复杂性,我想简单地创建两个不同的商店和不同的实体,以确保这两个数据集不互相干扰。

,同时让你使用普通的香草代码这将满足你的“最头疼”的要求。

的基本步骤多家商店和模型如下:

    在模型
  • ,包括你的实体在“配置”,使用两个店不同的名称。
  • 建立核心数据堆栈时,合并模型
  • ,而不是添加只有一个持久化存储与配置协调为nil,添加两个存储与相应的配置名称。
+0

感谢您的建议。虽然我在将您的想法转换为代码时遇到了麻烦..但我已经编辑了该问题,请查看。 – eugene

+0

看到我编辑的答案。 – Mundi

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

然后,你可以创建任何你想要的momd车型PSC ...

NSPersistentStoreCoordinator *psc = [self pscForModelNames:@[@"CachedURLResponse", @"TemporaryPosts"]]; 
相关问题