【问题标题】:Handle synchronisation of data between Android Service and Server via REST API通过 REST API 处理 Android Service 和 Server 之间的数据同步
【发布时间】:2023-03-20 21:11:01
【问题描述】:

我正在尝试设计如何通过 REST API 最好地处理 Android 应用程序和远程服务器之间的数据同步。

现在仍处于早期阶段,但我的休息服务器基本上正在运行(无论如何都足以用于测试目的)。

我有 3 个表要同步(链接如下)。

节目 >----- 季节 >----- 剧集

服务器和设备都有这些表的相似版本,我需要将它们从设备同步到服务器(现在和最终两种方式)。同步将通过 Android 服务在后台对 REST API(插入/更新和删除)进行异步调用来实现。

现在我的主要问题是提出一个逻辑,以确保双方都得到相应的更新。

从设备到服务器的插入/更新将通过 POST 请求完成,所以我想在通过 ON INSERT/ON UPDATE TRIGGERS (SQlite) 填充的所有 3 个表上都有一个状态标志,允许同步服务计算行需要在服务器上进行。 这是正确的做法吗?

看起来像

CREATE TRIGGER sync_update_show AFTER UPDATE ON show
BEGIN
    UPDATE show SET sync_flag = 'TO_SYNC' WHERE _id = new._id
END

现在进行删除,该服务独立于主应用程序,我认为使用 BEFORE DELETE SQlite TRIGGERS 填充服务可以浏览的“TODELETE”表并触发对服务器的删除 api 调用。 这是正确的做法吗?

看起来像

CREATE TRIGGER sync_delete_show BEFORE DELETE ON show
BEGIN
    INSERT INTO todelete_show
    SELECT * FROM show WHERE _id = old._id
END

现在,当涉及到应用程序同步的服务器时,我只需获取所有记录(API 调用)并处理设备上的插入/更新/删除(浏览返回的记录)。但是可能有一种更有效的方法来优化带宽(返回的 JSON 可能很大)。

我欢迎对此提出任何意见,因为我不想开始实施服务并意识到我完全错了!

【问题讨论】:

    标签: android api sqlite rest client


    【解决方案1】:

    您使用数据库触发器管理变更日志的方法肯定会奏效。如果您想要更面向对象的方法,您可以为您的业务对象公开一个 CRUD API,然后在 API 中使用更新/插入/删除标记更新变更日志表,而不使用数据库触发器。

    如果您对使用同步框架感兴趣,我想提请您注意 OpenMobster 的同步服务。

    您可以进行以下同步操作

    • 双向
    • 单向客户端
    • 单向装置
    • 启动

    除此之外,所有修改都会自动跟踪并与云端同步。当网络连接中断时,您可以让您的应用程序离线。它将跟踪任何更改,并在连接返回时自动在后台与云同步。

    它还支持跨多个设备的同步,例如 iCloud。

    在云端,您只需编写一个 Java 通道,它是您数据的 CRUD 接口,并将通道公开给同步引擎。在设备端,这些数据可以通过基于 CRUD 的 Sync API 获得。同步引擎会自动处理所有其他同步细节,例如管理变更日志、冲突管理、复制到多个设备等。

    在你的情况下,

    ChangeLog 自动管理并与同步引擎集成。它使用我提到的面向对象的方法,并且通过基于 CRUD 的 Sync API 处理同步。

    这里是开源项目的链接:http://openmobster.googlecode.com

    这是一个了解它的一些工作原理的教程:http://code.google.com/p/openmobster/wiki/AndroidSyncApp

    【讨论】:

      【解决方案2】:

      我认为您使用触发器的方法绝对可行,我建议您使用单个“SYNC”表来记录您需要进行的所有网络操作,这样即使您处于离线状态,所有网络操作也都安排在尽可能执行,并在您执行任务后将其从“SYNC”表中删除。

      我强烈建议您实现一个 ContentProvider 来存储您的表格,因为您可以更轻松地在您的活动/片段中利用许多 Android API,尤其是 CursorLoaders 和 CursorAdapters。

      看看 contentProviders :http://developer.android.com/guide/topics/providers/content-provider-creating.html

      还可以看看 SyncAdapter: http://developer.android.com/reference/android/content/AbstractThreadedSyncAdapter.html

      还可以看看这个关于在 android 上构建 restful 应用程序的讨论,有点旧,但我认为它仍然非常有效 http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html

      【讨论】:

      • 感谢您提供的信息。我认为此时我不需要 ContentProvider,因为我不打算与我的休息服务器以外的其他应用程序共享内容。我一定会考虑它的未来!
      猜你喜欢
      • 2018-07-20
      • 2011-08-30
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 2012-12-24
      • 2014-10-07
      • 2013-01-19
      相关资源
      最近更新 更多