2010-02-11 62 views
2

我有一个使用iPhone上的Core Data的现有应用程序。偶尔会更新应用程序的数据作为App Store的更新。在我完美的世界中,构建一个应用程序来编辑OS X应用程序更新中的数据,并将sqlite数据库复制到我的iPhone应用程序捆绑包中,这将是一种相对没有痛苦的方式。OS X和iPhone OS之间Core Data的SQLite文件的可移植性

是否可以在OS X和iPhone OS之间移动sqlite数据库(假设他们使用相同的数据模型)?

我应该注意哪些事情是不可移植的(比如32位和64位数据)?

有没有更好的选择,我忽略了?

回答

6

具有相同数据模型的Mac和iPhone应用程序的SQLite格式相同。生成一个Mac应用程序来编辑数据库非常简单(我为我的iPhone应用程序执行此操作)。事实上,你可以把你的数据模型和快速拖放界面,它(从Core Data Programming Guide FAQ):

在Mac OS X v10.5及其以后,在 界面生成器,你可以拖动核心 数据实体项目从库中的 窗口或框。界面生成器 然后提供了一个面板,允许您从 中选择您想要从 当前打开的Xcode项目中选择的实体。

请注意,您也可以创建并在 Interface Builder中配置 配置NSController实例。如在 创建用户界面的情况下,你 选项单击在Xcode的数据 建模工具实体(或选择从 图书馆 核心数据实体的项目),但是你把它拖到了 接口生成器文件窗口。对于 编辑一个对象,创建一个 NSObjectController实例为 ;为了编辑许多对象,创建了一个 NSArrayController实例。

我还会检查出Core Data Editor,它会加载到您编译的托管对象模型中,并允许您从中编辑数据库。

0

是的,你可以做到这一点。问题是什么时候需要更改数据库模式;因此您可能需要考虑将数据转储为不同的格式,然后在需要推出新版本时重新加载。

+1

改变架构也没有问题。 Core Data支持在iPhone和桌面上进行版本控制,并且API是相同的。事实上,即使不需要映射模型,它们也会自动进行轻微的模式更改。 – 2010-02-11 23:26:41

2

我做的完全一样(在MacOS上创建一个核心数据库,复制sqlite文件并在iPhone上使用它),它看起来很完美。然而,最近我遇到了这种方法导致的性能问题,对此我没有找到另一种解决方案,而是回到在iPhone模拟器中创建数据库。这个问题是这样的:

如果您有:M两个表之间的关系,那么核心数据的iPhone味道创建一个链接表看起来像这样:

CREATE TABLE Z_13FOO(Z_13BAR2 INTEGER,Z_15FOO INTEGER, PRIMARY KEY(Z_13BAR2,Z_15FOO));

鉴于MacOS的风味创建此:

CREATE TABLE Z_13FOO(Z_13BAR2,Z_15FOO); CREATE INDEX Z_13FOO_Z_13BAR2_INDEX ON Z_13FOO(Z_13BAR2); (Z_15FOO);

尽管看起来连接表上的两个索引允许表foo和bar之间的快速连接,但与iPhone核心数据创建的主键约束版本相比,我测得的性能损失大于100倍。

这可能与您的情况无关,但在分析性能问题时应该注意这一点,因为这不是一个非常明显的陷阱!

如果有人有这个问题的解决方案,使我可以使用MacOS核心数据创建数据库,我原计划 - 请在这里发布一个答案!