我正在寻找一些通用策略,用于将中央服务器上的数据与并非总是在线的客户端应用程序同步。
在我的特殊情况下,我有一个带有sqlite数据库的android phone应用程序和一个带有MySQL数据库的phone应用程序。
用户将能够在电话应用程序和web应用程序上添加和编辑信息。我需要确保在一个地方所做的更改在所有地方都能反映出来,即使手机不能立即与服务器通信。
我不关心如何将数据从手机传输到服务器,反之亦然。我之所以提到我的特定技术,只是因为我不能使用MySQL可用的复制功能。
我知道客户机-服务器数据同步问题已经存在很长时间了,我希望获得有关处理该问题的模式的信息--文章、书籍、建议等。我想知道处理同步的一般策略,以比较优势、劣势和权衡。
发布于 2015-01-16 20:12:09
如果有人正在处理类似的设计问题,并且需要在多个安卓设备之间同步更改,我推荐使用Google Cloud Messaging for Android。
我正在研究一种解决方案,其中在一个客户端上所做的更改必须传播到其他客户端。我刚刚实现了一个概念验证实现(服务器&客户端),它的工作方式非常出色。
基本上,每个客户端都将增量更改发送到服务器。例如,资源id ABCD1234已从值100变为99。
服务器根据其数据库验证这些增量更改,然后批准更改(客户端处于同步状态)并更新其数据库,或者拒绝更改(客户端不同步)。
如果变更被服务器批准,则服务器通过GCM通知其他客户端(不包括发送增量变更的客户端),并发送携带相同增量变更的组播消息。客户端处理此消息并更新其数据库。
很酷的是,这些更改几乎是瞬间传播的!如果这些设备在线的话。而且我不需要在这些客户端上实现任何轮询机制。
请记住,如果设备离线时间太长,并且GCM队列中等待传递的消息超过100条,则GCM将丢弃这些消息,并在设备恢复在线时发送一条特殊消息。在这种情况下,客户端必须与服务器进行完全同步。
也可以检查this tutorial,开始使用CGM客户端实现。
发布于 2016-10-21 12:19:49
这回答了使用Xamarin框架的开发人员(请参阅https://stackoverflow.com/questions/40156342/sync-online-offline-data)
使用xamarin框架实现这一点的一个非常简单的方法是使用Azure的离线数据同步,因为它允许按需从服务器推送和拉取数据。读操作在本地完成,写操作按需推送;如果网络连接中断,写操作将排队,直到连接恢复,然后执行。
实现相当简单:
1)在azure门户中创建移动应用(您可以在https://tryappservice.azure.com/这里免费试用)
2)将您的客户端连接到移动应用。https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started/
3)设置本地存储库的代码:
const string path = "localrepository.db";
//Create our azure mobile app client
this.MobileService = new MobileServiceClient("the api address as setup on Mobile app services in azure");
//setup our local sqlite store and initialize a table
var repository = new MobileServiceSQLiteStore(path);
// initialize a Foo table
store.DefineTable<Foo>();
// init repository synchronisation
await this.MobileService.SyncContext.InitializeAsync(repository);
var fooTable = this.MobileService.GetSyncTable<Foo>();
4)然后推送和拉取您的数据,以确保我们拥有最新的更改:
await this.MobileService.SyncContext.PushAsync();
await this.saleItemsTable.PullAsync("allFoos", fooTable.CreateQuery());
发布于 2018-06-06 19:56:38
我建议你也看看Symmetricds。它是一个可用于安卓系统的SQLite复制库。您可以使用它来同步您的客户端和服务器数据库,我还建议在服务器上为每个客户端设置单独的数据库。尝试在一个mysql数据库中保存所有用户的数据并不总是最好的主意。特别是当用户数据将快速增长时。
https://stackoverflow.com/questions/3406891
复制相似问题