我正在创建我的第一个iPhone应用程序。该应用程序当前使用sqlite数据库的核心数据。存储在数据库中的内容将在应用程序中保持静态,但是我们可能希望在应用程序中添加更多内容 - 这就是我的问题所在。
我知道在路上我不会负责维护应用程序,负责人可能不熟悉技术 - 所以我想尽可能简单地更新内容。我越来越多地阅读有关使用核心数据进行更新的内容,我越是认为无法轻松更新内容。我还想通过应用商店分发更新(现在我不允许在网络服务器上存储任何数据)。
在我理想的设置中,我希望能够为数据库编写前端(而不是iphone),并让我的用户通过用户友好的GUI更新数据库内容。然后只需使用此更新的数据库并通过应用商店将其推出。在使用核心数据时这可能吗?我正在阅读有关版本控制和迁移的内容,对于我的简单应用程序而言,这一切看起来都非常复杂(或者我错误地将其用于此)?我最好只使用没有核心数据的sqlite数据库吗?
无论如何,我有兴趣听到有关使用核心数据或使用核心数据更新内容的任何想法。
谢谢
答案 0 :(得分:2)
我目前正在完成您列出的内容(减去用户友好界面,我只是一个命令行工具)。它工作得很好,我构建并运行该工具,它使用plist文件重新生成我的核心数据持久存储sqlite数据库。当您推出应用程序时,将覆盖具有相同文件名的文件。如果您的sqlite数据库核心数据被称为“asdf.sqlite”,那么您只需确保它包含在您的新捆绑包中,它将替换旧的捆绑包。
但是,请注意更改数据模型。在这种情况下,您将需要执行数据模型迁移并将旧模型映射到新模型。如果您尝试使用较旧的数据模型访问核心数据持久性存储,则会遇到运行时错误。
如果没有人对数据模型进行更改,那么你没事。只需使用自定义工具重建数据库,就可以将项目移交给其他人。
回复:
重新生成核心数据 持久存储......究竟是什么 你完成了吗?你怎么 知道什么时候更新商店或做 你每次创建商店 app运行?
我的命令行应用程序具有与iPhone应用程序相同的数据模型和实体源代码的引用(符号链接)(这样,iPhone项目中的更改将可用于我的命令行工具)。我的项目查找plist文件,我必须自定义应用程序以运行整个plist文件并将该信息添加到核心数据数据库。每次运行应用程序时,它都会删除旧的sqlite文件并将其替换为新文件。因此,如果我需要让其他人管理我的应用程序,他们只需要知道如何修改该plist文件以及如何运行命令行应用程序。 Out在构建应用程序的debug文件夹中弹出一个sqlite数据库。
我的应用程序是一个参考工具,因此我只需要在参考资料更改时更新我的核心数据db。当我进行更改时,我将生成的sqlite文件复制到我的iPhone项目中,并确保将其复制到应用程序包中。
顺便说一句,这种方法只适用于您计划在应用上发送READ ONLY数据的情况。如果在使用部署的应用程序时将写入相同的持久性存储,则每次更新时,用户的更改都将丢失。您可以使用多个存储(一个用于只读,一个用于用户写入的数据)来解决这个问题。我描述的方法假设您只通过应用商店更新对核心数据db进行更新。如果您的核心数据生成代码在您的iphone应用程序中,那么您可以在每次应用程序运行时重新生成代码,但如果数据是静态的并且在您更新应用程序之前不会发生变化则不需要。
<强> RE 强>
您的应用是否重建了sqlite数据库 每次运行时的文件夹 还有吗?
简答:不,我的iPhone应用程序每次运行时都不会重建sqlite数据库。我的iPhone应用程序永远不会重建数据库。
长答案:再次澄清,有两个申请。 App1是使用核心数据db的iPhone应用程序,App2是生成核心数据db的桌面应用程序。最初,只有iPhone应用程序App1。每次iPhone应用程序运行时,它都会从plist(XML)文件重新生成sqlite数据库。由于我的数据库非常大,它增加了我的应用程序的加载时间。这是不可接受的,所以我做了这样,以便iPhone应用程序只在无法找到db文件时生成数据库(表明该应用程序是第一次运行)。然后我意识到第一次没有必要让应用程序加载更长时间,所以我完全从我的iPhone应用程序中删除了该代码,并创建了一个单独的Mac OSX命令行应用程序app2来处理生成sqlite数据库。这个程序app2只在我的电脑上运行,因此我必须将生成的sqlite文件手动放入我的iPhone app1项目中。这个重建的sqlite db文件仅在我向App Store提交更新时才可供用户使用。
答案 1 :(得分:2)
过去一周发生的一切都发生了变化。我可以完全诚实地说出这一点,我已经找到了解决所有愤怒和对Core Data不断增长的仇恨的解决方案。我现在真的很喜欢它。为什么? (因为害怕听起来像电视购物节目......)
我开始使用RestKit。它基本上使一切变得如此简单。我认为它最初的目的是通过在线JSON资源实时向Core Data提供对象,但是,他们已经添加了使用JSON种子数据库的能力,非常轻松。
您的在线JSON数据可以是静态文本文件(我是如何开始的),也可以通过数据库上的REST后端或其他方式将它们提取出来。 RestKit不会为你提供这个部分,但是在你的论坛上有很多知识渊博的人,以防你对此感到不舒服。
此外,只需稍微调整一下,我在我的应用程序中构建了RestKit的实现,以便仅查询后端的最新对象,并在应用程序运行时在后台就地加载新数据。
说真的,认真,认真地看看,特别是如果你只是在布局一个新应用程序,因为实施会更快。他们有一些很好的例子可以帮助你入门。
答案 2 :(得分:1)
更新内容和修改数据模型之间存在差异。可以在现有数据模型(模式)内完成更新内容。例如,您的应用可能会提供有关电影的信息,并且您可以定期添加或修改电影信息。这可以通过从网站读取并将更改合并到本地Core Data存储(可用作本地缓存)来完成。
但是,如果您预计会更改数据模型,那么这是另一回事。例如,您可能在应用的第一个版本中省略了电影长度。要添加它,您需要修改数据模型。 (免责声明:我不知道以编程方式修改数据模型是多么容易。)
更新内容应该相对容易设计。修改数据模型似乎有点复杂 - 特别是如果轻量级迁移工具无法处理修改。
答案 3 :(得分:0)
当你谈到通过应用商店分发内容时,你真的在谈论更新整个应用程序。当您在应用程序中更改数据库时,您将不得不重建应用程序,提交它,并等待一周才能获得批准。如果您可以找到在Web服务器上仅发布数据库(或可以解析到数据库中的XML文件)的方法,那么您将能够在不更改应用程序本身的情况下更新内容。对于维护应用程序的非技术人员来说,这将更容易,并且还可以让您更快地获得更新。
答案 4 :(得分:0)
你需要做的就是开发一个我 喜欢能够写一个前端 (不是在iPhone上)数据库 并让我的用户更新数据库 内容通过用户友好的GUI。
这很简单,因为MacOS和iOS都使用相同的核心数据。只要您在iOS上开发模型并且不使用任何花哨的东西,例如将UIImage存储在可转换属性中,然后相同的精确数据模型和存储将适用于两个操作系统。
然后,您只需使用绑定将模型连接到简单的GUI界面,以便用户可以更新商店。一旦他们拥有了商店文件,他们就可以将它包含在与旧商店完全相同的下一个版本中。该应用程序永远不会知道差异。
如果您想将数据推送到现有已安装的应用程序,那么它当然会变得更加复杂,具体取决于您希望如何提供新数据。