【发布时间】:2010-11-18 20:39:16
【问题描述】:
我正在做一个 iPhone 应用程序。在这个应用程序中,我只想有一个数据库用作我应用程序中值的查找表。数据库唯一要做的就是根据程序的查询向我提供我需要的值。它不会在数据库中进行任何添加或删除。我的问题是如何使用 CoreData 在应用程序上初始化默认数据。这样当程序启动时它已经拥有了所有需要的值。
如果您有其他更好的建议或其他选择,请告诉我。
谢谢。
【问题讨论】:
我正在做一个 iPhone 应用程序。在这个应用程序中,我只想有一个数据库用作我应用程序中值的查找表。数据库唯一要做的就是根据程序的查询向我提供我需要的值。它不会在数据库中进行任何添加或删除。我的问题是如何使用 CoreData 在应用程序上初始化默认数据。这样当程序启动时它已经拥有了所有需要的值。
如果您有其他更好的建议或其他选择,请告诉我。
谢谢。
【问题讨论】:
请参阅核心数据编程指南,或见下文(从 PG 复制):
" 如何使用默认数据初始化商店?
这里有两个问题:创建数据,以及确保数据只导入一次。 有几种方法可以创建数据。
您可以创建一个单独的持久存储,其中包含默认 数据并将商店作为应用程序资源包含在内。当你想要的时候 要使用它,您必须将整个商店复制到合适的 位置,或将对象从默认存储复制到现有 店铺。对于小型数据集,您可以创建托管对象 直接在代码中。
您可以创建属性列表或其他一些基于文件的 表示——数据,并将其存储为应用程序资源。 当你想使用它时,你必须打开文件并解析 表示来创建托管对象。
您不应该在 iOS 上使用这种技术,只有在 Mac OS X 上绝对必要时才使用。解析文件以创建商店会产生不必要的开销。最好自己离线创建一个 Core Data 存储并直接在您的应用程序中使用它。 还有几种方法可以确保只导入一次默认值:
如果您使用 iOS 或创建非基于文档的应用程序 Mac OS X,您可以在应用程序启动时添加检查以确定 文件是否存在于您指定的位置 应用商店。如果没有,则需要导入数据。为了 基于 iOS 的示例,请参阅 CoreDataBooks 。
如果您使用 NSPersistentDocument 创建基于文档的应用程序,则初始化 initWithType:error: 中的默认值。
如果存储(因此文件)可能 已创建但未导入数据,则可以添加元数据标志 到商店。您可以检查元数据(使用 metadataForPersistentStoreWithURL:error:) 比 执行 fetch (并且它不需要你硬编码任何 默认数据值)。
"
如上所述,一般我们需要用代码创建一个预填充的默认存储,然后将其用作 资源文件,如果缺少核心数据文件,则将其从资源包复制到文档目录。请在 Xcode Organizer(或 Apple Developer Center)中搜索 CoreDataBooks 代码示例,并查看 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator 方法。
【讨论】:
我绞尽脑汁想解决这个问题好几个小时。我想出的只是不保存数据库。这样,每次打开应用程序时都会对其进行初始化。如果保存它,它将继续复制。
【讨论】:
我将创建一个简单的 Mac 应用程序,从基于 Core Data 文档的应用程序的模板开始。将现有的 .xcdatamodel 复制到项目中的默认模型上(或添加新数据模型并确保在引用默认模型的任何地方重命名)。在 Interface Builder 中打开文档窗口的 XIB 文件,然后从 Interface Builder 库检查器中将 Core Data Entity 项拖到其中。在出现的对话框中,选择要显示的实体并选择要在其中显示的界面。
这将创建一个功能齐全的界面,用于添加、删除或编辑该实体类型的属性。一切都应该通过 Cocoa Bindings 连接起来,这样您就不需要为此编写一行代码。您可以通过这种方式为模型中的每个实体类型添加接口。
这将让您在 Core Data 文档中快速输入和编辑数据,然后您可以将其保存到磁盘并作为资源添加到您的 iPhone 应用程序中。 SQLite 数据库结构在桌面和 iPhone Core Data 实现之间完全兼容,因此我发现这是测试 iPhone Core Data 代码的一种快速简便的方法。
【讨论】:
我会编写一个工具,用您想要的数据填充数据库,在构建时生成数据库并将其填充到您的资源文件夹中。如果你不打算写信,你可以把它放在那里直接访问它,如果你确实想写信,你需要把它复制到你可以写的地方(比如文档文件夹)。
【讨论】: