Это хорошая практика для запроса объекта с областью вне транзакции? - PullRequest
0 голосов
/ 23 мая 2018

Мне было интересно ... Это хорошая практика для запроса какого-либо объекта за пределами транзакции области?Я имею в виду, я не хочу изменять этот объект, я просто хочу получить объект и увидеть его данные.

Хорошо ли сделан этот код?

Articulo mArticulo = realm.where(Articulo.class).and().equalTo("IDArticulo", 2).findFirst();

Или это обязательно сделать так?

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(@NonNull Realm realm) {
        Articulo mArticulo = realm.where(Articulo.class).and().equalTo("IDArticulo", 2).findFirst();
    }
});

А что будет, если я захочу использовать этот предмет вне транзакции?Потому что я не могу получить к нему доступ извне этой транзакции.Каков наилучший способ сделать это?

Ответы [ 4 ]

0 голосов
/ 26 мая 2018

Если вы не хотите закрывать экземпляр области вручную,

try(Realm realm = Realm.getDefaultInstance(){
   Articulo mArticulo = realm.where(Articulo.class).and().equalTo("IDArticulo", 2).findFirst();    
}

Здесь mArcticulo - это управляемый объект.Старайтесь не иметь дело с управляемыми объектами.вы можете скопировать управляемый объект в немаркированный объект,

try(Realm realm = Realm.getDefaultInstance(){
   Articulo mArticulo = realm.where(Articulo.class).and().equalTo("IDArticulo", 2).findFirst();    
   if(mArticulo != null)
      mArticulo = realm.copyFromRealm(mArticulo); //better approach

}
  • Try-with-resources автоматически закрывает экземпляр области.

Вам не нужно использовать executeTransaction для чтения.Требуется только для записи / изменения объектов в Realm.

0 голосов
/ 23 мая 2018

Вы должны использовать транзакции только при изменении объектов Realm, таких как вставка / удаление / обновление их.

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

0 голосов
/ 23 мая 2018

Транзакции предназначены для изменения данных, или «транзакция записи».

Они не нужны для начала чтения данных.

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

Следует отметить, что когда вам нужно изменить данные в RealmResults, вы должны либо использовать итератор, расширенный цикл, либо использовать только int индекс в обратном направлении, либо использовать int index для коллекции снимков.

0 голосов
/ 23 мая 2018

Вы можете использовать этот запрос вне метода executeTransaction(), если вы предоставите правильный экземпляр Realm

Для получения дополнительной информации, проверьте это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...