iphone - 如何将 iPhone Core Data 与 Web 服务器同步,然后推送到其他设备?

标签 iphone ios core-data sync data-synchronization

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .


4年前关闭。







Improve this question




我一直在研究一种在多个设备(例如 iPad 或 Mac)之间同步存储在 iPhone 应用程序中的核心数据的方法。 iOS 上与 Core Data 一起使用的同步框架并不多(如果有的话)。但是,我一直在思考以下概念:

  • 对本地核心数据存储进行更改,并保存更改。 (a) 如果设备在线,它会尝试将变更集发送到服务器,包括发送变更集的设备的设备 ID。 (b) 如果变更集没有到达服务器,或者设备不在线,应用程序会将变更集添加到队列中,以便在它上线时发送。
  • 位于云中的服务器将其接收到的特定更改集与其主数据库合并。
  • 在云服务器上合并更改集(或更改集队列)后,服务器使用某种轮询系统将所有这些更改集推送到向服务器注册的其他设备。 (我想使用 Apple 的 Push 服务,但显然根据评论这不是一个可行的系统。)

  • 我需要考虑什么花哨的事情吗?我看过 REST 框架,例如 ObjectiveResource , Core Resource , 和 RestfulCoreData .当然,这些都与 Ruby on Rails 一起工作,我不依赖于它,但它是一个开始的地方。我对解决方案的主要要求是:
  • 任何更改都应该在后台发送而不暂停主线程。
  • 它应该使用尽可能少的带宽。

  • 我考虑了一些挑战:
  • 确保将不同设备上不同数据存储的对象 ID 附加到服务器上。也就是说,我将有一个对象 ID 和设备 ID 表,它们通过对存储在数据库中的对象的引用来绑定(bind)。我会有一条记录(DatabaseId[对这个表唯一],ObjectId[对整个数据库中的项目唯一],Datafield1,Datafield2),ObjectId字段会引用另一个表,AllObjects:(ObjectId,DeviceId,DeviceObjectId)。然后,当设备推送一个变更集时,它将从本地数据存储中的核心数据对象传递设备 Id 和 objectId。然后我的云服务器会检查 AllObjects 表中的 objectId 和 device Id,并在初始表中找到要更改的记录。
  • 所有更改都应加盖时间戳,以便可以合并它们。
  • 设备将不得不轮询服务器,而不会消耗太多电池。
  • 如果/当从服务器接收到更改时,本地设备还需要更新内存中保存的任何内容。

  • 还有什么我在这里想念的吗?我应该看什么样的框架才能使这成为可能?

    最佳答案

    我做了一些类似于你正在尝试做的事情。让我告诉你我学到了什么以及我是如何做到的。

    我假设您的核心数据对象和服务器上的模型(或数据库模式)之间存在一对一的关系。您只是想让服务器内容与客户端保持同步,但客户端也可以修改和添加数据。如果我猜对了,请继续阅读。

    我添加了四个字段来帮助同步:

  • 同步状态 - 仅将此字段添加到您的核心数据模型。应用程序使用它来确定您是否对项目有待处理的更改。我使用以下代码:0 表示没有更改,1 表示已排队等待同步到服务器,2 表示它是一个临时对象,可以清除。
  • is_deleted - 将此添加到服务器和核心数据模型。 Delete 事件实际上不应该从数据库或客户端模型中删除一行,因为它让您没有任何东西可以同步回来。通过这个简单的 bool 标志,您可以将 is_deleted 设置为 1,同步它,每个人都会很高兴。您还必须修改服务器和客户端上的代码以使用“is_deleted=0”查询未删除的项目。
  • 最后修改 - 将此添加到服务器和核心数据模型。每当该记录发生任何变化时,该字段都应由服务器自动更新为当前日期和时间。它不应该被客户修改。
  • 指导 - 向服务器和核心数据模型添加一个全局唯一 ID(参见 http://en.wikipedia.org/wiki/Globally_unique_identifier)字段。该字段成为主键,在客户端上创建新记录时变得很重要。通常,您的主键是服务器上的递增整数,但我们必须记住,内容可以离线创建并稍后同步。 GUID 允许我们在离线时创建 key 。

  • 在客户端上,每当发生更改并需要同步到服务器时,添加代码以将模型对象上的 sync_status 设置为 1。新模型对象必须生成 GUID。

    同步是单个请求。请求包含:
  • 模型对象的 MAX last_modified 时间戳。这告诉服务器您只希望在此时间戳之后进行更改。
  • 一个 JSON 数组,包含所有 sync_status=1 的项目。

  • 服务器获取请求并执行以下操作:
  • 它从 JSON 数组中获取内容并修改或添加它包含的记录。 last_modified 字段会自动更新。
  • 服务器返回一个 JSON 数组,其中包含 last_modified 时间戳大于请求中发送的时间戳的所有对象。这将包括它刚刚收到的对象,作为记录已成功同步到服务器的确认。

  • 应用程序接收响应并执行以下操作:
  • 它从 JSON 数组中获取内容并修改或添加它包含的记录。每条记录的同步状态设置为 0。

  • 我希望这会有所帮助。我交替使用了记录和模型这个词,但我想你明白了。祝你好运。

    关于iphone - 如何将 iPhone Core Data 与 Web 服务器同步,然后推送到其他设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5035132/

    相关文章:

    swift - 核心数据,初始化 managedObjectContext

    iphone - 为什么我没有用这个简单的代码读取任何磁场值?

    iphone - 在iphone objective-c中将联系人添加到地址簿

    ios - 动画(旋转)UIBarButtonItem 自定义按钮

    iphone - 是否可以在获取请求期间让 Core Data 对一对多关系的 "many"部分进行排序?

    iphone - 管理核心数据 iCloud 事务日志

    iphone - 将 View 动画设置为新的宽度和高度

    iphone - iOS中如何访问需要认证的URL

    ios - 创建白色半透明 UINavigationBar

    ios - Swift 核心数据单元测试 : How to avoid EXC_BREAKPOINT