【问题标题】:How to synchronize a SQLite Core Data database with a remote MySQL database?如何将 SQLite Core Data 数据库与远程 MySQL 数据库同步?
【发布时间】:2014-08-22 09:22:39
【问题描述】:

我最近完成了一个 iOS 应用程序的工作,并且大部分内容都以应用程序应有的方式运行。我设法创建了一个使用 Core Data 持久保存到 SQLite DB 的多用户应用程序。然而,现在是用户希望从远程设备(即他们自己的手机或他们使用的任何支持网络的设备)管理他们的帐户的时候了。话虽如此,我做了一点谷歌搜索,发现我需要创建一个“网络服务”。现在需要注意的是,我已经在运行应用程序的 iDevice 上的 SQLite DB 中积累了数据。我想将现有数据推送到 MySQL 数据库或远程机器,并使其同步。例如,当用户在 iOS 设备上更新他们的帐户时,更改会被推送到 MySQL 数据库,并且如果用户使用标准浏览器连接到 Web 服务,该浏览器会更新 iOS 设备上的 SQLite 数据库。

我开始学习 Rails 是因为我认为创建一个简单的 Web 前端供用户管理他们的帐户是一个很好的解决方案,并且它公开了一个 API 供开发人员操作数据库中的数据。基本上,我想听听来自社区的一些建议,或者可以为我正在努力完成的工作提供一个良好起点的链接。

【问题讨论】:

    标签: mysql ios database sqlite core-data


    【解决方案1】:

    如果您正在查看 rails,请尝试查看 ActiveAdmin gem。这是我在我的第一个 iOS 和 Rails 项目中为客户使用的。它为您提供了一个管理仪表板,如果您可以设置它,它将处理您想要的很多东西。一开始很混乱,但几周后会给你一个很好的网络解决方案。此外,根据您在创建服务器方面的经验,您可能希望在 Heroku 中寻找能够为您完成所有工作的低成本主机(如果您开始需要更多处理器,Heroku 很快就会变得昂贵)。从 github 项目中,您可以在大约 5 分钟内启动 heroku 并运行您的 rails 代码。

    至于将数据库从服务器同步到手机:您需要为服务器数据库上的模型设置一种 last_updated_at 时间戳。现在,当任何内容更新时,您将更新时间戳。现在 iOS 应用程序可以将 ?last_updated_at 参数传递给您的服务器。这将允许您的服务器找出自上次 ping 服务器以来发生的所有更改。然后在手机上将其 gnab 到您的核心数据数据库中。

    将手机同步到服务器:

    在同步之前首先确保手机是最新的(使用 last_updated_at 参数)。如果它很清楚,那么这就是困难的地方。您需要翻译要从 CoreData db 同步的对象(因为它会自动添加自己的列/表)并将它们传递。否则,您可以传递您的 coreData 数据库并在服务器上进行某种转换。

    在您的 iPhone 应用程序中进行转换,并进行更新以从 CoreData 迁移。这会很痛苦,但从长远来看,如果您部署到其他操作系统,它会有所帮助。您需要创建 sqlite3 查询以将 CoreData 数据库转换为新的 SQL 数据库(我们能够在 iPhone 5 上在 1.2 秒内复制 2-3MB 的数据,因此速度非常快)。然后应用程序将只使用 SQLite3,以便它可以将整个数据库同步到服务器。然后这将使与手机的同步变得更容易,它可以从服务器中获取完整的数据库并将其插入。

    【讨论】:

    • 感谢您的建设性回答。
    • 是的,它很有帮助,仍在构建 Rails 应用程序的过程中:/
    【解决方案2】:
    typedef NS_ENUM(NSInteger, RecordStatus){
    
    RecordStatusUnchanged = 0,
    RecordStatusUpdated   = 1,
    RecordStatusAdded     = 2,
    RecordStatusRemoved   = 3
    };
    

    创建一个名为 change_record 的新 SQL 表。列(item_id、status、category_name)

    为了更新

    change_record表:从本地数据库获取item_id,保持状态RecordStatusUpdated,设置category_name

    添加

    change_record 表:item_id 为空,保持状态 RecordStatusAdded , 设置category_name

    删除

    change_record表:从本地数据库,你会得到item_id,保持状态RecordStatusRemoved , 将 category_name 设置为空

    使用后台服务检查每个 n 时间间隔的互联网连接是否可用。

    如果 change_record 计数 > 0。 然后将所有项目(使用循环)发送到服务器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2013-11-12
      • 2011-07-28
      • 2017-01-06
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      相关资源
      最近更新 更多