У меня возникает проблема, когда Realm иногда возвращает мне разные данные каждый раз, когда я делаю тот же запрос. В настоящее время я использую SyncAdapter для загрузки. Идея состоит в том, что мы пытаемся реализовать автономный режим.Синхронизация данных данных в реальном времени
Итак, когда пользователь создает элемент, он добавляется в Realm db. Я генерирую идентификатор для этого элемента вручную, получая maxId и добавляя к нему 1000. После этого я отправляю itemID в UploadSyncAdapter, где я получаю itemById и отправляю его на бэкэнд, а бэкэнд возвращает мне элемент с реальным идентификатором. Поэтому после этого я удаляю старый элемент и просто вставляю новый элемент в Realm.
После того, как я вернусь и прочитаю данные, они возвращаются каждый второй раз, например массив данных размером 115, а в другой раз массив размером 116. Я даже ищу элемент с отладчиком по идентификатору, и он действительно один раз находит предмет, второй раз он этого не делает. Но похоже, что после того, как я перестрою проект, элемент там, и он работает нормально, или если я перезапущу приложение, используя Instant Run.
Любая помощь приветствуется ...
UPDATE Btw Я использую 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 я также просто вычисляю 2 поля объекта перед сохранением в Realm (так что у меня есть эти значения, также сохраненные в Realm)
Мне нужно будет увидеть код транзакции, в котором вы делаете удаление и вставляете новый элемент, чтобы дать правильный ответ. Я предполагаю, что вы используете несколько транзакций в фоновом потоке и не оцениваете запрос для получения элементов внутри транзакции. Кроме того, убедитесь, что вы закрыли Realm в фоновом потоке (так что поток адаптера синхронизации), когда вы закончили операцию, и повторно откройте экземпляр Realm для следующей операции. – EpicPandaForce
Ой, я был прав: несколько транзакций и выполнение запросов для определения параметров записи за пределами транзакции (хотя было бы неплохо увидеть код для 'filterTasksByPermission') – EpicPandaForce
Также вы должны рассмотреть вопрос о помещении' realm. close() 'in' finally {'. – EpicPandaForce