我有一个问题,即每次境界我做同样的查询时间有时会返回我不同的数据。目前我正在使用SyncAdapter进行上传。这个想法是我们正试图实现离线模式。领域的数据同步不一致
因此,当用户创建一个项目得到它的加入境界分贝。我通过获取maxId并向其添加1000来手动生成该项目的ID。之后,我将itemID发送到UploadSyncAdapter,在那里获取itemById并将其发送到后端,后端将带有真实ID的项目返回给我。所以之后,我删除旧的项目,并将新项目插入Realm。
在我回去读取数据后,它每隔两次返回一个数组,例如一个大小为115的数据,另一次是大小为116的数组。我甚至用调试器通过ID搜索项目,它真的是一次找到该项目,第二次找不到该项目。但它看起来像重建项目后,项目在那里,它正常工作,或者如果我通过使用即时运行重新运行应用程序。
赞赏任何帮助...
UPDATE 顺便说一句,我使用RXjava到从服务器获取数据,但它被认购,当前线程(线程SyncAdapter)上观察到。
下面的代码:
@Override
public void onNext(TaskResponse taskResponse) {
tasksDatabaseManager.deleteTaskById(taskId);
List<Task> tasks = taskResponse.getTaskDataList();
tasksDatabaseManager.insertTasks(tasks);
}
public void deleteTaskById(int taskId){
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
RealmResults<Task> rows = realm.where(Task.class).equalTo(ID, taskId).findAll();
rows.deleteAllFromRealm();
realm.commitTransaction();
realm.close();
}
private void copyOrUpdateTasks(List<Task> tasksList){
Realm realm = Realm.getDefaultInstance();
ArrayList<Task> updatedTaskList;
//first initialize task permissions
updatedTaskList = filterTasksByPermission(tasksList);
//initialize custom task data
for (Task task : updatedTaskList) {
initializeTaskCustomFields(task);
}
//save new data
Log.d(TAG, "tasks number before update: " + getTasks().size());
realm.beginTransaction();
realm.copyToRealmOrUpdate(updatedTaskList);
realm.commitTransaction();
realm.close();
Log.d(TAG, "tasks number after update: " + getTasks().size());
}
在filterTasksByPermission我只是计算任务的一些权限,但在任务列表中返回。并且在initializeTaskCustomFields中,我也只是在保存到Realm之前计算对象的2个字段(以便我将这些值也保存在Realm中)
我需要查看您的交易代码,您在哪里删除并插入新元素以给出正确的答案。我的猜测是你在后台线程上使用多个事务,而不是评估查询来获取事务内的元素。此外,请确保在完成操作后关闭后台线程上的领域(以便同步适配器的线程),然后重新打开Realm实例以进行下一步操作。 – EpicPandaForce
噢,看,我是对的:多个事务并执行查询来确定事务外的写入参数(虽然很高兴看到'filterTasksByPermission'的代码) – EpicPandaForce
还应该考虑放置'realm。 close()'在'finally {'中。 – EpicPandaForce