2.3.3 数据同步更新上传操作

## 2.2.3 数据同步更新上传操作(可选操作) * 数据同步更新上传是针对备忘、提醒、闹钟、记账、录音等功能的数据操作,对这些功能生成的对应的备忘数据、提醒数据、闹钟数据、记账数据、录音数据的新建、删除、修改、查询操作时需要将本地的数据与服务端的数据同步。备忘、提醒、闹钟、记账、录音在sdk中定义了相应的实体类,分别为MemoEntity、RemindEntity、AlarmClockEntity、BillEntity、TapeEntity。这些实体类都继承自SyncSegment。 SyncSegment中包含的同步属性(**本地记录上传时必须提供**)如下所示: ~~~ /** 服务端对应记录的ID */ protected String sid; /** 本地记录的ID */ protected int lid; /** 时间戳(服务端返回),版本号 */ protected long timestamp; /** 回收状态,0=可用,1=回收站 */ protected int recyle; /** 是否已经同步 */ protected transient boolean synced; ~~~ **同步更新上传示例:以提醒为例** 1. 定义一个类实现同步接口:`interface SyncDao<T extends SyncSegment>` ~~~ /** * 提醒动作对象同步操作Dao实现 **/ public class RemindEntityDao implements SyncDao<RemindEntity> { @Override public int getTargetId() { //targetId:动作对象id,提醒(RemindEntity)为308。 return RobotConstant.ACTION_REMIND; } /** * 获取目前对象的实体类 */ @Override public Class<RemindEntity> getTargetClass() { return RemindEntity.class; } /** * 获取本地记录中最大的同步时间戳 */ @Override public long getLastTimestamp() { long t = 0; Remind remind = 以timestamp倒序排列,查找数据库第一条提醒记录; if (remind !=null) t = remind.getTimeStamp(); return t; } /** * 合并服务端的数据,合并策略(永远以服务端数据为优先): * 1.本地含有相同lid的记录:覆盖合并到本地记录; * 2.本地没有相同lid的记录,插入本地记录; * @return true:合并成功,false:SDK将会调用{@linkplain SyncDao#mergeServerData(List) mergeServerData(List)}处理 */ @Override public boolean mergeServerData(JsonArray jsonArray) { System.out.println("Remind mergeServerData>>" + jsonArray); return false; } /** * 合并服务端的数据,合并策略(永远以服务端数据为优先): * 1.本地含有相同lid的记录:覆盖本地记录; * 2.本地没有相同lid的记录,插入本地记录; * @param data * @return true:合并成功 */ @Override public boolean mergeServerData(List<RemindEntity> list) { if (list != null && list.size() > 0){ //TODO 第一步:本地合并服务端返回的数据 //第二步:由于服务器端一次最多只能合并100条数据,合并数据后需要再递归请求数据刷新,保证所有云端数据合并完毕 AndroidChatRobotBuilder.get().robot().actionTargetAccessor().syncUpdate(this); } return true; } /** * 查询未同步的本地记录 * @param size 返回的最大长度 * @return */ @Override public List<RemindEntity> getUnSyncLocalData(int size) { List<RemindEntity> list = new ArrayList<>(); //TODO 获取数据库所有记录,并将synced = false(未同步)的记录加入list中; //注意:由于服务器端有记录上传限制,所以list的最大容量建议<= 500。 return list; } /** * 查询未同步的本地记录的总数 * @return */ @Override public int getUnsyncLocalDataCount() { int c = 获取数据库中synced = false(即未同步)的记录总数; return c; } /** * 查询未同步的本地记录 * @param size 返回的最大长度 * @return null:SDK将会调用{@linkplain SyncDao#getUnSyncLocalData() getUnSyncLocalData()}查询 */ @Override public JsonArray getUnSyncLocalDataAsJsonArray(int size) { return null; } } ~~~ 2. 在需要同步的地方调用同步方法:ActionTargetAccessor类的 boolean sync(SyncDao var1); 例如,本地删除提醒记录(建立同步机制后,删除并非直接清除该记录,而是设置删除标记表示已删除) ① 设置删除标记和待同步标记,保存记录(delRemind:要删除的提醒对象) ~~~ //synced:同步标记(true 已同步 false 待同步) delRemind.setSynced(false); //recyle:删除标记(0 有效记录 1 已删除记录) delRemind.setRecyle(1); //TODO 保存delRemind对象到本地数据库中,update方法需开发者实现 update(delRemind); ~~~ &nbsp; &nbsp; &nbsp;② 本地保存后需更新同步到云端 ~~~ //同步方法,注意mRemindEntityDao所有查询相关的方法必须能够查询到最新状态的记录,否则该同步方法将失败 AndroidChatRobotBuilder.get().robot().actionTargetAccessor().sync(mRemindEntityDao); ~~~