【问题标题】:How do I initialize a store with default data in a CoreData application?如何在 CoreData 应用程序中使用默认数据初始化存储?
【发布时间】:2010-11-18 20:39:16
【问题描述】:

我正在做一个 iPhone 应用程序。在这个应用程序中,我只想有一个数据库用作我应用程序中值的查找表。数据库唯一要做的就是根据程序的查询向我提供我需要的值。它不会在数据库中进行任何添加或删除。我的问题是如何使用 CoreData 在应用程序上初始化默认数据。这样当程序启动时它已经拥有了所有需要的值。

如果您有其他更好的建议或其他选择,请告诉我。

谢谢。

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    请参阅核心数据编程指南,或见下文(从 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 方法。

    【讨论】:

      【解决方案2】:

      我绞尽脑汁想解决这个问题好几个小时。我想出的只是不保存数据库。这样,每次打开应用程序时都会对其进行初始化。如果保存它,它将继续复制。

      【讨论】:

        【解决方案3】:

        我将创建一个简单的 Mac 应用程序,从基于 Core Data 文档的应用程序的模板开始。将现有的 .xcdatamodel 复制到项目中的默认模型上(或添加新数据模型并确保在引用默认模型的任何地方重命名)。在 Interface Builder 中打开文档窗口的 XIB 文件,然后从 Interface Builder 库检查器中将 Core Data Entity 项拖到其中。在出现的对话框中,选择要显示的实体并选择要在其中显示的界面。

        这将创建一个功能齐全的界面,用于添加、删除或编辑该实体类型的属性。一切都应该通过 Cocoa Bindings 连接起来,这样您就不需要为此编写一行代码。您可以通过这种方式为模型中的每个实体类型添加接口。

        这将让您在 Core Data 文档中快速输入和编辑数据,然后您可以将其保存到磁盘并作为资源添加到您的 iPhone 应用程序中。 SQLite 数据库结构在桌面和 iPhone Core Data 实现之间完全兼容,因此我发现这是测试 iPhone Core Data 代码的一种快速简便的方法。

        【讨论】:

        • @"BradLarson" 这个功能(“将核心数据实体项拖到视图中”)似乎在 XCode4 中已停用。
        • 当您需要在未来的版本中迁移数据库时会发生什么?您是否必须为模型的每个版本重新构建默认数据库?我很好奇在第一次运行时从一些属性列表中填充数据库是否更好,我很想听听你的建议。谢谢布拉德!
        • @iWasRobbed - 在这种情况下,您也需要将捆绑的数据库迁移到最新版本。您希望避免浪费时间为每个 iOS 安装进行升级。我为此构建的 Mac 客户端能够将数据库更新为最新架构,以便部署在较新应用程序版本的 iOS 应用程序包中。
        【解决方案4】:

        我会编写一个工具,用您想要的数据填充数据库,在构建时生成数据库并将其填充到您的资源文件夹中。如果你不打算写信,你可以把它放在那里直接访问它,如果你确实想写信,你需要把它复制到你可以写的地方(比如文档文件夹)。

        【讨论】:

        • 这是一个相当古老的答案。这仍然是真的吗?如果我不打算写入预填充的数据库,我可以直接从资源中读取它吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多