在线/离线数据管理

Jos*_*osa 10 database algorithm core-data ios parse-platform

我必须创建一个功能类似于联系人应用程序的应用程序.您可以在客户端的iPhone上添加联系人,并将其上传到客户端的iPad上.如果客户在iPad上更新联系人,则应在iPhone上更新.

其中大部分都是相当直接的.我Parse.com用作我的后端并在本地保存联系人Core Data.我遇到的唯一问题是在用户离线时管理联系人.

假设我有iPhone和iPad.它们目前都具有相同版本的在线数据库.我的iPhone现在处于离线状态.现在是上午9点.

上午10点,我更新了iPad上的联系人的电话号码.它在本地和在线保存更改.上午11点我更新了iPhone上同一联系人的电子邮件地址,但我仍然处于离线状态.

中午,我的iPhone连接到互联网并检查服务器是否有变化.它看到它的更改比最新更新(检查updatedAt时间戳属性)更新,因此它不会下载联系人的新电话号码("已过时"),而是覆盖电话号码和电子邮件地址(更新新的电话号码到它的旧版本,因为它在上午10点的电话号码更新期间处于离线状态,并且其更改应该是最近的更新).

我该如何管理上面遇到的在线/离线问题?我能想到的解决方案是在联系人的每个属性上保留更新的时间戳,而不仅仅是updatedAt整个联系人的常规属性,例如,更新名字的时间,更新姓氏的时间,然后手动检查是否有离线设备每个属性都有更新的更改,而不是覆盖整个对象,但这似乎很草率.

我还在考虑在每个对象上都有一个updatedLocallyupdatedOnlinetimestamp属性Core Data.这样如果两者不匹配,我可以进行差异检查,并使用最新的冲突,但这似乎仍然不是最干净的解决方案.有没有其他人遇到类似的东西?如果是这样,你是如何解决的?

认为 Pseudocode/Summary是什么涵盖了每个测试用例,但仍然不是很优雅/完整:

Parse.com上的2个实体:联系和联系历史

联系人有第一个,最后一个,电话,电子邮件,在线更新

联系历史记录具有要引用的联系人的主键以及具有历史记录的相同属性.例如first: [{value:"josue",onlineUpdate:"9AM"},{value:"j",onlineUpdate:"10AM"},{value:"JOSUEESP",onlineUpdate:"11AM"}]

1核心数据实体,联系方式:

联系人有第一个,最后一个电话,电子邮件,onlineUpdate和offlineUpdate(重要提示:这仅适用于Core Data,不适用于Parse)

for every contact in parse database as onlineContact {
    if onlineContact does not exist in core data {
        create contact in core data
    }
    else {
        // found matching local object to online object, check for changes
        var localContact = core data contact with same UID as onlineContact
        if localContact.offlineUpdate more recent than onlineContact.onlineUpdate {
            for every attribute in localContact as attribute {
                var lastOnlineValueReceived = Parse database Contact History at the time localContact.onlineUpdate for attribute
                if lastOnlineValueReceived == localContact.attribute {
                    // this attribute did not change in the offline update. use latest available online value
                    localContact.attribute = onlineContact.attribute
                }
                else{
                    // this attribute changed during the more recent offline update, update it online
                    onlineContact.attribute = localContact.attribute
                }
            }
        }
        else if onlineContact.onlineUpdate more recent than localContact.offlineUpdate {
            // another device updated the contact. use the online contact.
            localContact = offlineContact
        }
        else{
            // when a device is connected to the internet, and it saves a contact
            // the offline/online update times are the same
            // therefore contacts should be equivalent in this else statement
            // do nothing
        }
}
Run Code Online (Sandbox Code Playgroud)

TL; DR:您应该如何构建一种用于在线/离线更新的版本控制系统而不会意外覆盖?我想将带宽使用限制在最低限度.

小智 -1

  • 您可以使用单独的表来存储所有更新联系人的 ID(存储联系人信息的数据库表中的主键),而不是为每个核心数据对象设置单独的标志。

  • 稍后,当用户上线时,您只需从实际的联系人详细信息表中获取这些联系人并将其上传到您的服务器上。