【问题标题】:Updating Iphone Application Content Using Core Data使用 Core Data 更新 Iphone 应用程序内容
【发布时间】:2011-03-16 19:31:41
【问题描述】:

我正在创建我的第一个 iPhone 应用程序。该应用程序当前使用带有 sqlite 数据库的核心数据。存储在数据库中的内容将在应用程序中保持静态,但是在以后我们可能希望向应用程序添加更多内容 - 这就是我的问题所在。

我知道以后我不会负责维护应用程序,而且负责人可能不精通技术 - 所以我想让更新内容变得尽可能简单。我读到的关于使用核心数据更新的内容越多,就越让我觉得要轻松更新内容是不可能的。我还想通过应用商店发布更新(现在我不能在网络服务器上存储任何数据)。

在我的理想设置中,我希望能够为数据库编写前端(不是在 iphone 上),并让我的用户通过用户友好的 GUI 更新数据库内容。然后只需获取这个更新的数据库并通过应用商店将其推出。在仍然使用核心数据的同时这可能吗?我正在阅读有关版本控制和迁移的信息,对于我的简单应用程序来说,这一切似乎真的很复杂(或者我是否误解了这一点)?只使用没有核心数据的 sqlite db 会更好吗?

无论如何,我很想听听有关使用或使用核心数据更新内容的任何想法。

谢谢

【问题讨论】:

    标签: iphone core-data


    【解决方案1】:

    我目前正在做你列出的事情(减去用户友好的界面,我的只是一个命令行工具)。它工作得很好,我构建并运行该工具,它使用 plist 文件重新生成我的核心数据持久存储 sqlite 数据库。当您推出您的应用程序时,具有相同文件名的文件将被覆盖。如果您的 Core Data 的 sqlite db 名为“asdf.sqlite”,那么您只需确保它包含在您的新包中,它将替换旧包。

    但是,在更改数据模型时要小心。在这种情况下,您需要执行数据模型迁移并将旧模型映射到新模型。如果您尝试使用较旧的数据模型访问核心数据持久存储,则会遇到运行时错误。

    如果没有人对数据模型进行过更改,那么您就可以了。只需使用您的自定义工具来重建数据库,您就可以将项目交给其他人。

    回复:

    至于重新生成核心数据 持久存储...究竟是怎样的 你完成这个?你怎么 知道何时更新商店或做 您每次创建商店 应用运行了吗?

    我的命令行应用程序具有与 iPhone 应用程序相同的数据模型和实体源代码的引用(符号链接)(这样 iPhone 项目中的更改将可用于我的命令行工具)。我的项目寻找一个 plist 文件,我必须对应用程序进行自定义编程以运行整个 plist 文件并将该信息添加到核心数据数据库中。每次我运行应用程序时,它都会删除旧的 sqlite 文件并用新文件替换它。因此,如果我需要让其他人管理我的应用程序,他们只需要知道如何修改该 plist 文件以及如何运行命令行应用程序。 Out 会在构建应用程序的调试文件夹中弹出一个 sqlite 数据库。

    我的应用程序是一个参考工具,所以我只需要在参考材料发生变化时更新我的​​核心数据db。当我进行更改时,我会将生成的 sqlite 文件复制到我的 iPhone 项目中,并确保它被复制到应用程序包中。

    顺便说一句,这种方法仅适用于您计划在您的应用中发送只读数据的情况。如果在使用部署的应用程序时将写入相同的持久存储,那么每次更新它时,用户的更改都会丢失。您可以通过使用多个存储(一个用于只读,一个用于用户写入的数据)来解决此问题。

    我描述的方法假设您仅通过应用商店更新对核心数据数据库进行更新。如果您的核心数据生成代码在您的 iphone 应用程序中,那么您可以在每次应用程序运行时重新生成代码,但如果数据是静态的并且预计在您更新应用程序之前不会更改,则不需要它。

    回复:

    您的应用程序是否重建了 sqlite 数据库 每次运行时的文档文件夹 也一样?

    简短回答:不,我的 iPhone 应用程序不会在每次运行时重建 sqlite 数据库。我的 iPhone 应用从不重建数据库。

    长答案:再次澄清,有两个应用程序。 App1是使用核心数据db的iPhone应用,App2是生成核心数据db的桌面应用。最初,只有 App1,即 iPhone 应用程序。每次 iPhone 应用程序运行时,它都会从 plist (XML) 文件中重新生成 sqlite db。由于我的数据库非常大,因此我的应用程序的加载时间增加了很多。这是不可接受的,所以我这样做是为了让 iPhone 应用程序仅在找不到 db 文件时才生成 db(表明该应用程序是第一次运行)。然后我意识到第一次没有必要让应用程序加载时间过长,所以我从我的 iPhone 应用程序中完全删除了该代码,并制作了一个单独的 Mac OSX 命令行应用程序 app2 来处理生成 sqlite db。这个程序 app2 只在我的电脑上运行,所以我必须把生成的 sqlite 文件手动放到我的 iPhone app1 项目中。这个重建的 sqlite db 文件只有在我向 App Store 提交更新时才对用户可用。

    【讨论】:

    • 感谢 pokstad。我不会很快看到我的用户更改数据模型,所以我不会担心这个。至于重新生成核心数据持久存储......你究竟是如何做到这一点的?您如何知道何时更新商店或每次应用运行时创建商店?
    • 有道理。据我了解,我的应用程序包中有我的数据库,然后将其复制到下载应用程序的 iPhone 用户的文档文件夹中。您的应用程序是否在每次运行时都会重建文档文件夹中的 sqlite 数据库? (这是我不太明白的部分)
    • 感谢您的帮助。我会沿着这条路走——这似乎是我的情况的最佳选择。
    【解决方案2】:

    老实说,在过去的两年里,我已经经历了一百次。每当我想更新数据库的内容时,我从来没有EVER对我不得不破解和削减核心数据丑陋的方式感到满意。此外,在发布应用程序之前“植入”数据库从未像应有的那样优雅或明显。

    过去一周发生的一切都发生了变化。我可以完全诚实地说,我已经找到了解决我对 Core Data 的所有愤怒和日益增长的仇恨的方法,因为它要保持最新状态。我现在真的很喜欢它。为什么? (怕听上去像电视广告……)

    我开始使用RestKit。它基本上使一切变得容易得多。我认为它最初的目的是从在线 JSON 资源实时向 Core Data 提供对象,但是,他们已经添加了使用 JSON 为数据库播种的功能,非常容易。

    您的在线 JSON 数据可以是静态文本文件(我是这样开始的),或者您可以通过数据库上的 REST 后端或其他方式提供它们。 RestKit 不为您提供这部分,但如果您对此不满意,他们的论坛上有很多知识渊博的人。

    此外,只进行了细微的调整,我在我的应用程序中构建了我的 RestKit 实现,以仅在后端查询最近的对象,并在应用程序运行时在后台就地加载新数据。

    认真、认真、认真地看看这个,特别是如果你只是在设计一个新的应用程序,因为实施会更快。他们有一些很好的例子可以帮助你入门。

    【讨论】:

    • +1 这很糟糕,希望我知道这一点。听起来这也是将 CouchDB 与 Cocoa 应用程序集成的一种很酷的方式。
    • 当然。我真的很喜欢 CouchDB,最初希望将它用作我的项目的后端,但是从我的 MySQL 模式迁移的时间/成本太高了。
    • 格雷格 - 感谢您的推荐。这绝对看起来很有用。对于这个特定的项目,客户不会让我在网络服务器上托管任何东西(很糟糕,但我在内部 IT 辩论中绝对没有发言权)。
    【解决方案3】:

    更新内容和修改数据模型是有区别的。更新内容可以在现有数据模型(模式)中完成。例如,您的应用程序可能会提供有关电影的信息,并且您可以定期添加或修改电影信息。这可以通过从网站读取并将更改合并到本地核心数据存储(将用作本地缓存)来完成。

    但是,如果您预计会更改数据模型,那就另当别论了。例如,您可能在应用程序的第一个版本中省略了电影长度。要添加它,您需要修改数据模型。 (免责声明:我不知道以编程方式修改数据模型有多容易。)

    更新内容应该相对容易设计。修改数据模型似乎更复杂一些 - 特别是如果修改无法由轻量级迁移工具处理。

    【讨论】:

    • 谢谢 - 我预计此时不会有任何数据模型更改,并且清楚地知道,如果他们想更改模型,他们将不得不找一个更有经验的人来协助。
    【解决方案4】:

    当您谈论通过应用商店分发内容时,您实际上是在谈论更新整个应用程序。当您更改应用程序中的数据库时,您必须重新构建应用程序,提交它,然后等待一周才能获得批准。如果您能找到一种在 Web 服务器上仅发布数据库(或可解析为数据库的 XML 文件)的方法,您将能够在不更改应用程序本身的情况下更新内容。这对于维护应用程序的非技术人员来说会更容易,并且还可以让您更快地获得更新。

    【讨论】:

      【解决方案5】:

      您需要做的是开发一个 Id 喜欢能写前端 (不在 iphone 上)用于数据库 并让我的用户更新数据库 内容通过用户友好的 GUI。

      这很简单,因为 MacOS 和 iOS 都使用相同的 Core Data。只要您在 iOS 上开发模型并且不使用任何花哨的东西,例如将 UIImage 存储在可转换属性中,那么相同的数据模型和存储将在两个操作系统上运行。

      然后,您只需使用绑定将模型连接到简单的 GUI 界面,以便用户可以更新商店。一旦他们有了商店文件,他们就可以将它包含在与旧商店完全相同的位置的下一个构建中。该应用程序永远不会知道其中的区别。

      如果您想将数据推送到现有已安装的应用程序,当然会变得更加复杂,具体取决于您希望如何提供新数据。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2010-10-30
        • 2011-01-02
        相关资源
        最近更新 更多