我正在编写一个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配置的实体。
答案 0 :(得分:0)
直接查看sqlite文件会告诉您几乎没有关于Core Data如何构建事物的信息。核心数据是一个对象图管理器。它只是使用未记录的方法将对象图转换为sql。您不能假设Core Data将创建具有任何特定格式/架构的sqlite文件,或者该格式将从API版本到API版本保持一致。
我从不打扰看多个商店的sqlite商店,所以我不知道他们是否为其他商店的实体创建了空表。它与核心数据的运作方式并不特别相关。我想存储是基于用于创建它们的数据模型构建的,无论是否将任何特定实体分配给特定商店。
不要误以为Core Data只是一个围绕SQL的轻量级包装器,因此你可以通过查看SQL来弄清楚发生了什么。 SQL只是Core Data的一个选项,一个在游戏后期加入的选项。