访问可以更新的罐装应用资源的正确方法是啥?

Posted

技术标签:

【中文标题】访问可以更新的罐装应用资源的正确方法是啥?【英文标题】:What's the proper way to access a canned app resource that can be updated?访问可以更新的罐装应用资源的正确方法是什么? 【发布时间】:2012-05-27 04:55:10 【问题描述】:

我们有一个使用核心数据的 ios 应用程序,我们正在使用初始数据库填充应用程序数据。 (SQLite)。稍后它将从互联网下载数据并更新数据库。我们将 SQLite 数据库复制到 Documents 文件夹。 Apple 表示这是不正确的,因为 Documents 文件夹中的文件会自动备份到 iCloud。他们不允许这样做,除非这些文件是用户创建的。

他们提到的解决方案。

    为文件(在我们的案例数据库中)设置一个标志,它不会备份到 iCloud。但这仅适用于 iOS 5.1,我们不能这样做。我们需要支持 iOS 4 及更高版本。 (https://developer.apple.com/library/ios/#qa/qa1719/_index.html)

    维护临时文件夹中的文件(我们的例子是它的数据库)。但是他们提到要删除我们在应用退出时放在临时文件夹中的所有内容。同样,这不是解决方案。

但我的问题是,如果我们不删除那有什么问题?当用户从 AppStore 更新到下一个应用程序版本时,临时文件夹会发生什么?它会删除内容还是在应用更新时保留临时文件夹中的任何内容?

或者有人对这个问题有其他解决方案吗?非常感谢您的帮助。

【问题讨论】:

我没有意识到它会同步所有应用程序文档但被禁止。苹果为什么要拍自己的腿?!我担心设备可能会在应用更新之前擦除缓存数据。 是的。我们不能依赖缓存文件夹。文档说操作系统可以在任何给定时间擦除内容。 老实说,这只是一个愚蠢的情况,似乎我们必须在 NSUserDefaults 中存储所有 sqlite 数据库、xml 配置文件、用户会话信息和所有其他东西:( 见:***.com/questions/9850069/… 【参考方案1】:

我实际上看到了两种解决您问题的方法。

    仅在 iOS 5.1+ 上为您的文件设置标志,如果操作系统低于 5.1,请不要这样做。

    阅读有关将文件保存到磁盘的文档,temp 和 Documents 并不是您可以存储信息的唯一两个地方。在所述文档文件中,它应该说明每个文件夹的内容何时被删除。

【讨论】:

问题是我们必须支持从 iOS 4 开始的旧 iOS。 为什么会是个问题?你可以做类似if(os >= 5.1) setFlag();的事情。那当然是伪代码。【参考方案2】:

为什么不尝试从 Documents 文件夹中读取数据库?如果它在那里,太好了,你在做生意。如果它不存在,那么您一定没有下载比应用程序附带的版本更新的版本,因此请打开应用程序包中的数据库。

【讨论】:

这不是正确的方法。正如您所说,如果我们再次将可写数据库副本放入 Documents 文件夹,他们可能会拒绝。事实上,这就是我们现在正在做的事情。感谢您再次阅读该问题。 你没有说你正在写入数据库。一旦你这样做了,它就变成了一个用户文件和一些应该备份到 iCloud 的东西。如果数据库很大并且用户可能更改的数据量相对较小,那么最好将用户数据写入单独的数据库并管理两者(使用Core Data容易,使用SQLite可能不太容易)。【参考方案3】:

在这里阅读了一些文档后,我觉得解决方案是正确的。

--> iCloud 和 iTunes 不备份以下目录的内容:

/AppName.app

/库/缓存

/tmp

--> 更新过程中保证会保留以下目录中的文件:

/文档

/图书馆

所以我将我的初始数据库复制到库/缓存中。并在该数据库之上进行任何更新。但我觉得如果设备在低磁盘空间上运行,它可能会删除缓存文件夹的内容。在这种情况下,我检查数据库是否存在,如果它不存在,我会再次复制。 (作为预防措施)。但在这种情况下,用户可能会丢失一些数据。但是 Apple 仍然没有为此提供适当的指南。

【讨论】:

以上是关于访问可以更新的罐装应用资源的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

分离资源服务器和授权服务器的正确方法是啥?

链接URL是啥意思

描述嵌套 CloudFormation 堆栈资源的正确方法是啥?

在 MFC 项目中使用资源文件的正确方法是啥?

jdbcTemplate 更新中的 Spring 瞬态数据访问资源异常

为不同角色提供资源访问的方法是啥?