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