【发布时间】:2018-02-11 01:54:21
【问题描述】:
现在让我解决这个问题:是的,不使用 Core Data 几乎可以肯定是一个错误。然而,当我做出这些决定时,我是 iOS 开发的新手,我不知道我会像这样受挫。此外,该应用还打算在 Android 上运行(最终),所以我尽可能避免使用特定于平台的 API。
我有一个将数据存储在本地 SQLite 数据库文件中的 iOS 应用程序。存储在文件中的数据由用户提供,因此保持安全非常重要。我有计划“稍后再做”,后来现在就在这里。我很快意识到这不会像我希望的那样简单......
我现在明白,跨设备无缝同步数据是不可能的,我愿意接受这一限制,直到我设法迁移到 Core Data。但是,与此同时,我至少希望定期备份 SQLite 数据库,以便用户可以在单个设备上使用该应用程序感到安全。我在想我会这样做:
- 定期(例如每周一次)将 SQLite 文件从本地存储复制到云存储,从而确保备份
- 应用启动时,如果本地存储丢失或损坏,但文件存在于云存储中,请询问用户是否要复制它
这种方法的最大问题是用户可以在多台设备上运行应用程序,因此存储在 iCloud 中的数据可能来自这些设备中的任何一台,但只能来自一台。为了解决这个问题,我认为我可以为云存储中的文件使用每个设备的唯一名称。我会使用UIDevice.identifierForVendor 生成它。
所以我的启动逻辑是:
- 确定云文件的唯一名称。
-
本地文件是否丢失或损坏,如果有,云文件是否存在?
2.1。询问用户是否要从云文件中恢复。让他们真的很难拒绝,因为这样做会丢失他们的所有数据。
2.2。如果他们同意,请将云文件复制到本地文件存储。
- 打开本地数据库文件。
在后台运行时,我偶尔会将数据库文件从本地复制到云存储。
在我进行核心数据集成之前,我想知道这是否是一种明智的方法。另外,是否有任何我可能遗漏的隐藏“陷阱”?
更新:正如@TomHarrington 在评论中指出的那样,事实证明我的数据库文件已经位于/Documents,它已备份到iTunes 和任何iCloud 帐户。所以我的问题变成了这样:
我是否应该简单地确保我的数据库具有特定于设备的名称,以便它不会被连接到同一 iCloud 帐户的另一台设备上运行的应用破坏?
【问题讨论】:
-
大多数用户文档都包含在用户的备份中,无论是 iCloud 还是 iTunes。备份到 iCloud 会自动进行,并且很容易恢复。您确定甚至需要您的方法吗?
-
@TomHarrington 嗯,你是对的。我只是仔细检查了一下,我将文件存储在
/Documents中,如果用户登录,它显然由 iTunes 和 iCloud 备份。我想这在一定程度上改变了我的问题,是否应该给数据库文件一个设备特定的名称,这样它就不会被另一台运行相同应用程序的设备破坏,登录到相同的 iCloud 帐户...将更新问题。 -
@me-- iCloud 备份是特定于设备的,因此来自不同设备的备份不会相互覆盖