我正在尝试设计如何通过REST API最好地处理Android应用程序和远程服务器之间的数据同步。
现在它仍处于早期阶段,但我的休息服务器基本上已经运行(无论如何都足够用于测试目的)。
我有3个表要同步(链接如下)。
SHOW> ----- SEASON> ----- EPISODE
服务器和设备都有这些表的类似版本,我需要将它们从设备同步到SERVER(现在和最终两种方式)。同步将通过Android服务在后台进行REST API的异步调用(插入/更新和删除)来实现。
现在我的主要问题是提出一个逻辑,确保双方都得到相应的更新。
从设备到服务器的插入/更新将通过POST请求完成,所以我想在所有3个表上都有一个状态标志,通过ON INSERT / ON UPDATE TRIGGERS(SQlite)填充,允许同步服务计算出行需要在服务器上运行。 这是正确的方法吗?
看起来像
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可能很大)。
我欢迎任何意见,因为我不想开始处理服务实施,并意识到我错了!
答案 0 :(得分:1)
使用数据库触发器管理更改日志的方法肯定会有效。如果您需要更面向对象的方法,则可以为业务对象公开CRUD API,然后在API中更新带有更新/插入/删除标记的更改日志表,而不使用数据库触发器。
如果您对使用Sync Framework感兴趣,我想提请您注意OpenMobster的同步服务。
您可以执行以下同步操作
除此之外,所有修改都会自动跟踪并与云同步。当网络连接断开时,您可以让您的应用离线。它将跟踪任何更改,并在后台自动与连接返回时与云同步。
它还支持跨多个设备进行同步,例如iCloud。
在云端,您只需编写一个Java通道,它是数据的CRUD接口,并将通道公开给同步引擎。在设备端,此数据随后可通过基于CRUD的Sync API获得。所有其他同步详细信息(如管理更改日志,冲突管理,复制到多个设备等)都由同步引擎自动处理。
在你的情况下,
ChangeLog自动管理并与同步引擎集成。它使用我提到的面向对象方法,并通过基于CRUD的Sync API处理同步。
以下是开源项目的链接:http://openmobster.googlecode.com
以下是了解其部分工作原理的教程:http://code.google.com/p/openmobster/wiki/AndroidSyncApp
答案 1 :(得分:0)
我认为您使用触发器的方法可以明确地工作,我建议您使用单个“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