繁体   English   中英

使用核心数据更新Iphone应用程序内容

[英]Updating Iphone Application Content Using Core Data

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

我知道,将来我将不负责维护应用程序,并且负责人可能不精通技术-因此,我想尽可能轻松地更新内容。 我阅读有关使用核心数据进行更新的信息越多,就越使我认为不可能轻松地更新内容。 我还想通过App Store分发更新(目前不允许我在Web服务器上存储任何数据)。

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

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

谢谢

我目前正在执行您列出的内容(减去用户友好的界面,我只是一个命令行工具)。 它运行良好,我构建并运行该工具,并使用plist文件重新生成了我的核心数据持久存储sqlite数据库。 推出应用程序时,具有相同文件名的文件将被覆盖。 如果将用于核心数据的sqlite数据库称为“ asdf.sqlite”,则只需确保它包含在新捆绑包中,它将替换旧的捆绑包。

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

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

回覆:

至于重新生成核心数据持久性存储……您到底是如何实现的? 您如何知道何时更新商店或在每次运行应用程序时创建商店?

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

我的应用程序是一个参考工具,因此,仅当参考资料发生更改时,我才需要更新我的核心数据数据库。 进行更改时,我将生成的sqlite文件复制到我的iPhone项目中,并确保将其复制到应用程序包中。

顺便说一句,这种方法仅在您计划在应用程序上发送只读数据时才有效。 如果在使用已部署的应用程序时将写入同一持久性存储,则每次更新它时,用户的更改都将丢失。 您可以通过使用多个存储来解决此问题(一个存储为只读存储,一个存储为用户写入的数据)。

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

回覆:

每次运行时,您的应用是否还会在documents文件夹中重建sqlite db?

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

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

老实说,过去两年来我经历了一百次。 我是永远不会满意,我不得不破解,每当我想更新数据库的内容,通过核心数据丑陋削减的方式。 而且,在交付应用程序之前“播种”数据库从来没有像应该的那样优雅或显而易见。

过去一周发生的所有变化。 我可以说得很诚实,我已经找到了解决所有烦恼和对Core Data的最新仇恨的方法。 我现在真的很喜欢它。 为什么? (因为担心听起来像是电视广告...)

我开始使用RestKit 基本上,这使一切变得如此简单。 我认为它最初的目的是从JSON资源在线实时向Core Data提供对象,但是,自那时以来,它们已经添加了使用JSON轻松播种数据库的功能。

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

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

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

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

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

更新内容应该相对容易设计。 修改数据模型似乎更加复杂-尤其是如果轻量级迁移工具无法处理修改的情况。

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

您需要做的是开发一个我希望能够为数据库编写前端(不在iphone上)并让我的用户通过用户友好的GUI更新数据库内容的方法。

这很简单,因为MacOS和iOS都使用相同的核心数据。 只要您在iOS上开发模型并且不使用任何花哨的东西(例如,将UIImage存储在可转换属性中),则相同的确切数据模型和存储将在两个OS上都可以工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM