我有一個問題,即每次境界我做同樣的查詢時間有時會返回我不同的數據。目前我正在使用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