【问题标题】:Periodic iCloud backup of SQLite databaseSQLite 数据库的定期 iCloud 备份
【发布时间】:2018-02-11 01:54:21
【问题描述】:

现在让我解决这个问题:是的,不使用 Core Data 几乎可以肯定是一个错误。然而,当我做出这些决定时,我是 iOS 开发的新手,我不知道我会像这样受挫。此外,该应用还打算在 Android 上运行(最终),所以我尽可能避免使用特定于平台的 API。

我有一个将数据存储在本地 SQLite 数据库文件中的 iOS 应用程序。存储在文件中的数据由用户提供,因此保持安全非常重要。我有计划“稍后再做”,后来现在就在这里。我很快意识到这不会像我希望的那样简单......

我现在明白,跨设备无缝同步数据是不可能的,我愿意接受这一限制,直到我设法迁移到 Core Data。但是,与此同时,我至少希望定期备份 SQLite 数据库,以便用户可以在单个设备上使用该应用程序感到安全。我在想我会这样做:

  • 定期(例如每周一次)将 SQLite 文件从本地存储复制到云存储,从而确保备份
  • 应用启动时,如果本地存储丢失或损坏,但文件存在于云存储中,请询问用户是否要复制它

这种方法的最大问题是用户可以在多台设备上运行应用程序,因此存储在 iCloud 中的数据可能来自这些设备中的任何一台,但只能来自一台。为了解决这个问题,我认为我可以为云存储中的文件使用每个设备的唯一名称。我会使用UIDevice.identifierForVendor 生成它。

所以我的启动逻辑是:

  1. 确定云文件的唯一名称。
  2. 本地文件是否丢失或损坏,如果有,云文件是否存在?

    2.1。询问用户是否要从云文件中恢复。让他们真的很难拒绝,因为这样做会丢失他们的所有数据。

    2.2。如果他们同意,请将云文件复制到本地文件存储。

  3. 打开本地数据库文件。

在后台运行时,我偶尔会将数据库文件从本地复制到云存储。

在我进行核心数据集成之前,我想知道这是否是一种明智的方法。另外,是否有任何我可能遗漏的隐藏“陷阱”?

更新:正如@TomHarrington 在评论中指出的那样,事实证明我的数据库文件已经位于/Documents,它已备份到iTunes 和任何iCloud 帐户。所以我的问题变成了这样:

我是否应该简单地确保我的数据库具有特定于设备的名称,以便它不会被连接到同一 iCloud 帐户的另一台设备上运行的应用破坏?

【问题讨论】:

  • 大多数用户文档都包含在用户的备份中,无论是 iCloud 还是 iTunes。备份到 iCloud 会自动进行,并且很容易恢复。您确定甚至需要您的方法吗?
  • @TomHarrington 嗯,你是对的。我只是仔细检查了一下,我将文件存储在/Documents 中,如果用户登录,它显然由 iTunes 和 iCloud 备份。我想这在一定程度上改变了我的问题,是否应该给数据库文件一个设备特定的名称,这样它就不会被另一台运行相同应用程序的设备破坏,登录到相同的 iCloud 帐户...将更新问题。
  • @me-- iCloud 备份是特定于设备的,因此来自不同设备的备份不会相互覆盖

标签: ios sqlite core-data


【解决方案1】:

我将回答我的问题,因为我最终走上了这条路并找到了一个 MASSIVE 阻止程序。 UIDevice.identifierForVendor API 中存在一个错误,导致它在每次安装新版本的应用程序时重新生成!见here。这当然排除了将其用作设备标识符。 叹息

我认为我对这种方法很满意。相反,我可能会在第一次执行时生成一个 GUID 并使用 that 作为我的标识符。问题是,我需要将 那个 存储在未备份到 iCloud 的某个地方。

呃,我可能只是放弃这里,说我的应用程序不能在多个设备上运行,直到核心数据集成完成。

更新:我最终在第一次运行时生成了一个标识符并将其存储在钥匙串中(仅作为本地条目,因此不会备份到 iCloud)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    相关资源
    最近更新 更多