两个数据库的一个应用

时间:2011-12-09 01:06:32

标签: ios core-data

我的iPhone应用程序当前使用Core Data来保存用户创建的增长条目。我正在尝试将.sqlite文件添加到存储平均增长数据的应用程序中,以便我可以使用Core Plot向用户显示他们的增长与平均值的比较。

  • 我的应用程序非常适合存储和检索用户的数据。
  • 我编写了一个实用程序应用程序,用于创建包含平均数据的.sqlite文件
  • 我已将平均增长数据类文件,数据模型和.sqlite文件复制到我的主应用程序中。

注意:平均数据不需要是可写的。

经过大量搜索Stack Overflow和无数谷歌后,我得出结论,我想要做的是实现两个PersistentStoreCoordinator:一个用于用户输入的数据(readwrite),一个用于平均数据(readonly)。这是最好的课程吗?

如果是这样,我不知道从哪里开始。目前,我的Core Data Stack方法在我的AppDelegate.m中(Xcode放置它们)。如果我要给他们增加很多东西,我觉得我应该把它们搬到更好的地方,但我不知道那个更好的地方可能会在哪里。除此之外,我不知道应该从哪里开始尝试添加新的持久存储。

感谢您的帮助!

编辑以澄清: 如果我建议创建两个PersistentStores是正确的路线,我该怎么做?如果它不是最好的路线,我该怎么办?

3 个答案:

答案 0 :(得分:1)

以下是一些初学者:

如果您计划在不同商店中使用不同的实体组合,则需要向MOM添加“配置”。参见核心数据编程指南>信息的托管对象模型。

保留实际数据库的正常位置位于“应用程序支持目录”中,该目录位于用户>图书馆>应用程序支持> NameOfYourApp。表示此路径的字符串是自动生成的applicationSupportDirectory方法返回的内容。 (哎呀,你问的是iOS。在那里,applicationDocumentsDirectory方法返回沙箱的路径。)

自动生成的persistentStoreCoordinator访问者是添加商店的地方。您可以创建它的不同版本以添加不同的商店,或者您可以向应用程序委托添加属性,用于跟踪要使用的商店。例如,您可以执行以下操作,而不是将URL指向默认的“storedata”文件:

NSURL *url = [NSURL fileURLWithPath: [applicationSupportDirectory stringByAppendingPathComponent: @“nameOfStoreToAdd.sqlite”]];

addPersistentStoreWithType来电中,您需要使用NSSQLiteStoreType,而不是默认NSXMLStoreType。 (如果你得到一个NSUnderlyingException =“路径中的文件似乎不是SQLite数据库。”,这就是问题。)如果你为MOM设置了不同的配置,你会想要添加一个字符串识别此商店的configuration。稍后,您可以了解如何为options参数设置选项字典。

自动生成的managedObjectContext是调用persistentStoreCoordinator访问器的内容。所以,再次,你需要不同版本的这个或一些属性来咨询如何调用storeCoordinator访问者。

如果要切换数据库,首先要保存当前上下文,将其设置为storeCoordinator为nil,然后以检索其他商店的方式调用上下文访问器。 (或者你可以在同一时间保持多个上下文打开。只需确保设置单独的属性来保存它们及其storeCoordinators。)

只需拨打[[NSApplication sharedApplication] delegate],您就可以从应用的任何部分访问应用代理,因此将此代码留在那里是有意义的。如果它太长,你总是可以把它分解成一个类别。

我不是专家,所以其中一些可能有些不稳定,但一旦你开始,你可能会更好地了解在哪里寻找更详细的帮助。

答案 1 :(得分:1)

我已经解决了我的问题。这是我做的:

  • 为第二个数据库创建数据模型
  • 在appDelegate方法managedObjectModel:中,添加代码以合并两个模型(NSManagedObjectModel modelByMergingModels:)
  • 在appDelegate方法didFinishingLaunchingWithOptions:中,添加代码以确定数据库是否已存在。如果它不存在,则生成数据。

注意:在生成数据之前,您无需创建数据库。这将在您创建新实体时自动完成。

我唯一的缺点是我没有找到防止覆盖“第二”数据库中数据的方法。但我仍在寻找解决方案。

答案 2 :(得分:0)

您需要设置Persistent Store Coordinator以使用多个持久存储。看一下为对象模型定义Configurations以控制哪些模型对象存储在哪个持久性存储中。