Omi*_*ifi 255 android data-sharing android-syncadapter
我想在Android应用程序和服务器之间同步数据(例如数据库记录,媒体).如果您已经看过Evernote或类似的应用程序,您当然明白我的意思.
我有一些问题(想象一下我们想要同步DB记录):
每个用户都有自己的一部分服务器空间(例如Evernote或Dropbox).也许用户通过手机创建新记录并在服务器中创建新记录.我如何将这些记录匹配在一起?如果有相同ID的记录你建议我使用哪种算法?
除了JSON,手机设备和服务器之间有没有办法发送数据?
如果SyncAdapter和ContentProvider可以解决我的问题,请完全为我解释.(如果您可以向我提供一些示例或教程或任何建议或关键字,以帮助扩大/指导我的搜索也将受到赞赏).
Gra*_*smo 307
我将尝试通过解决更大的问题来回答您的所有问题:如何在网络服务器和Android应用之间同步数据?
在您的网络服务器和Android应用程序之间同步数据需要Android设备上的几个不同的组件.
这就是您的手机实际存储从网络服务器接收的数据的方式.实现此目的的一种可能方法是编写由Sqlite数据库支持的自定义ContentProvider.可以在此处找到适合内容提供商的体面教程:http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/
一个ContentProvider的定义一致的接口与存储的数据进行交互.如果您愿意,它还可以允许其他应用程序与您的数据进行交互.ContentProvider的后面可能是Sqlite数据库,Cache或任意存储机制.
虽然我肯定会建议将ContentProvider与Sqlite数据库一起使用,但您可以使用任何您想要的基于Java的存储机制.
这是您用于在Web服务器和Android应用程序之间发送数据的格式.目前最流行的两种格式是XML和JSON.在选择格式时,您应该考虑哪种序列化库可用.我知道有一个非常棒的json序列化库叫做gson:https://github.com/google/gson,虽然我确信XML存在类似的库.
您需要某种异步任务,它可以从您的服务器获取新数据并刷新移动内容以反映服务器的内容.每当您对内容进行本地更改并希望反映这些更改时,您还需要通知服务器.Android提供SyncAdapter模式作为轻松解决此模式的方法.您需要注册用户帐户,然后Android将为您执行许多魔术,并允许您自动同步.这是一个很好的教程:http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/
至于如何识别记录是否相同,通常您将创建具有唯一ID的项目,您将其存储在Android设备和服务器上.您可以使用它来确保您引用相同的参考.此外,您可以存储列属性,如"updated_at",以确保您始终获取最新鲜的数据,或者您不会意外地写入新写入的数据.
Pra*_*ani 58
如果我们考虑今天,接受的答案太旧了.我们知道我们有许多新的库可以帮助您创建这种类型的应用程序.
您应该学习以下可以帮助您的主题:
SyncAdapter:应用程序中的同步适配器组件封装了在设备和服务器之间传输数据的任务的代码.根据您在应用程序中提供的计划和触发器,同步适配器框架运行同步适配器组件中的代码.
领域:Realm是一个移动数据库:SQLite和核心数据的替代品.
由Square,Inc.改进 Android和Java的类型安全HTTP客户端必须学习智能使用方式 - 改造
和数据库的同步逻辑如下:如何在Android手机上将SQLite数据库与服务器上的MySQL数据库同步?
祝所有新学员好运.:)
ope*_*ter 24
如果你自己写这些,这些是要记住的一些要点
设备和Sync Server之间的正确身份验证
设备和服务器之间的同步协议.它通常分为3个阶段,认证,数据交换,状态交换(哪些操作有效,哪些失败)
选择有效负载格式.我建议基于SyncML的XML与基于JSON的格式混合来表示实际数据.因此协议的SyncML和正在交换的实际数据的JSON.在操作数据时使用JSON Array始终是首选,因为使用JSON Array可以轻松访问数据.
跟踪客户端和服务器上的数据更改.您可以维护更改的更改日志,这些更改会在同步会话期间进行更改和提取.此外,在对象成功同步时清除更改日志.您还可以使用布尔变量来确认同步状态,即上次同步.最终用户确定上次同步完成的时间将会很有帮助.
需要有一种方法从服务器通信到设备,以便在服务器上的数据更改时启动同步会话.您可以使用C2DM或编写自己的基于持久性tcp的通信.tcp方法非常无缝
一种在多个设备上复制数据更改的方法
最后但并非最不重要的是,一种检测和处理冲突的方法
希望这有助于作为一个良好的起点.
Cir*_*sta 14
@Grantismo对整体提供了很好的解释.如果你想知道谁在实际做这件事,我建议你去看看谷歌为2014年的谷歌IO应用程序做了什么(总是值得深入了解他们发布的这些应用程序的源代码.这里有从那里学到很多东西).
这是一篇关于它的博客文章:http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html
本质上,在应用程序方面:用于信令的GCM,用于数据获取的同步适配器以及与内容提供商正确交谈,这将使事情持久(是的,它将数据库与应用程序的其他部分的直接访问隔离开来).
此外,如果您想查看2015年的代码:https://github.com/google/iosched
例如,要同步表todoTable从MySql到Sqlite
首先,创建一个列名version (type INT)在todoTable两个Sqlite和MySql

其次,创建一个database_version包含一个列名的表名currentVersion(INT)

在MySql,当您向项目添加新项目todoTable或更新项目时,您必须将此项目的版本升级+1,并升级currentVersion

在Android,当您想要同步时(通过手动按下同步按钮或具有周期时间的服务运行):
您将使用SqlitecurrentVersion(当前为1)将请求发送到服务器.
然后在服务器中,您会发现哪个项目的MySql版本值大于SqlitecurrentVersion(1)然后响应Android(在此示例中,版本2的项目3将响应Android)
在SQLite,您将添加或更新新项目todoTable并升级currentVersion
小智 6
请看parseplatform.org.这是开源项目.
(除了你可以在back4app.com上找到商业套餐.)
它是一个非常直接和用户友好的服务器端数据库服务,提供了一个伟大的Android客户端API
| 归档时间: |
|
| 查看次数: |
188034 次 |
| 最近记录: |