2016-09-25 5 views
1

У меня есть RealmObjectUser, который я храню в одноэлементном режиме и получаю доступ во всем приложении - он был загружен в поток пользовательского интерфейса. Объект представляет зарегистрированного пользователя и имеет отношение «один ко многим» с классом Item. При изменении его в сделке, например, в:Чтение объекта RealmObject из другого потока

Это не будет работать, потому что я к нему доступ внутри транзакции, которая происходит в другом потоке. Чтобы уточнить, что мне нужно сделать, это сохранить идентификатор пользователя за пределами транзакции, а затем получить доступ к этой хранимой переменной в транзакции при выполнении запроса, например?

Integer userId = UserSingleton.getUser().getId(); 
Integer classId = mItem.getClassId(); 
RealmSingleton.getUserInstance().executeTransactionAsync(new Realm.Transaction() { 
     @Override 
     public void execute(Realm realm) { 
      User user = realm.where(User.class).equalTo("mId",userId).findFirst(); 
      user.deleteItem(classId); 
     } 
    }); 
+0

Это звучит правдоподобно, хотя я действительно задумываюсь о реализации 'deleteItem' – EpicPandaForce

+0

@EpicPandaForce - это всего лишь цикл, который выполняет итерацию через' '' '' '' Пользователь', пока не найдет один с соответствующим идентификатором класса, и когда он находит совпадение, которое он называет 'RealmList.deleteItemAt' - вот и все. – shoe

+0

А так https://realm.io/docs/java/latest/api/io/realm/RealmList.html#deleteFromRealm-int-? Хотя я предпочитаю получать элемент и называть его 'deleteFromRealm', он должен работать тогда. Какая странная проблема. – EpicPandaForce

ответ

2

Да, это правильно. Вы не можете получить доступ к объекту в нескольких потоках, поэтому в вашем случае сохраняете ссылку на идентификатор и используете это для запроса объекта, это правильный подход.

Смежные вопросы