为什么我的两个不同的Core Data数据存储区都具有相同的列?

时间:2011-09-05 18:40:30

标签: iphone objective-c core-data

我正在编写一个IOS应用程序,我最终希望有两个不同的数据存储,一个用于我们提供的静态数据,另一个用于动态用户数据。

我无法在Apple的文档中找到关于此的详细说明,但是:http://developer.apple.com/library/iOS/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html有一个图像,其中两个managedObjectContexts与一个持久存储协调器一起使用。 另一方面,这个答案在这里:Can Core Data handle my "system vs. user data" migration needs?表示“你可以将两个存储添加到NSPersistentStoreCoordinator并从一个NSMAnagedObjectContext访问它们。”

所以我做了一个简单的小实验,没有按计划进行。

我创建了一个新的基于导航的应用程序(在Xcode 3中),它使用Core Data进行存储。 (按下加号按钮并添加时间戳的那个) 我在数据模型中添加了另一个名为Person的实体。 Person有一个属性,名称,即NSString。在“配置:”中,我创建了两个配置“database1”和“database2”。原始Event实体属于database1,而Person实体属于database2。

我将apps委托中的persistentStoreCoordinator更改为如下所示:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"firstDB.sqlite"];
NSURL *secondStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"secondDB.sqlite"];

NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:@"database1" URL:storeURL options:nil error:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}   
NSError *error2 = nil;
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:@"database2" URL:secondStoreURL options:nil error:&error2]) {
    NSLog(@"Unresolved error %@, %@", error2, [error2 userInfo]);
    abort();
} 
return persistentStoreCoordinator_;
}

所以我创建了两个数据库,一个用于数据模型中的每个配置。

当我使用模拟器运行应用程序,并查看创建的sql数据库时,我注意到,当时间戳写入正确的数据库(上例中的firstDB.sqlite)时,两个数据库都包含zEvent列和zPerson柱。

我从这里看到:Using two different Core Data Models in the same iPhone app. How can I do it? 我也可以设置单独的整个核心堆栈(这是我第一次考虑这样做的方式)但是如果我可以将它们用于工作,我就有点不同配置的想法。

如果你们能告诉我这里的错误,我真的很感激。我希望firstDB.sqlite只包含属于database1配置的实体,而secondDB.sqlite只包含属于database2配置的实体。

1 个答案:

答案 0 :(得分:0)

直接查看sqlite文件会告诉您几乎没有关于Core Data如何构建事物的信息。核心数据是一个对象图管理器。它只是使用未记录的方法将对象图转换为sql。您不能假设Core Data将创建具有任何特定格式/架构的sqlite文件,或者该格式将从API版本到API版本保持一致。

我从不打扰看多个商店的sqlite商店,所以我不知道他们是否为其他商店的实体创建了空表。它与核心数据的运作方式并不特别相关。我想存储是基于用于创建它们的数据模型构建的,无论是否将任何特定实体分配给特定商店。

不要误以为Core Data只是一个围绕SQL的轻量级包装器,因此你可以通过查看SQL来弄清楚发生了什么。 SQL只是Core Data的一个选项,一个在游戏后期加入的选项。