在事务外查询对象是一个好习惯吗?

时间:2018-05-23 08:45:19

标签: android realm

我想知道..在领域事务之外查询某些对象是一个好习惯吗?我的意思是,我不想修改那个对象,我只想获取对象并查看其数据。

这段代码做得好吗?

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 :(得分:2)

交易用于修改数据,又称"写交易"。

您不需要他们开始阅读数据。

如果在任何其他线程/进程上存在打开的写事务,则开始写事务会阻塞该线程。但是当你开始时它会将版本颠覆到最新版本,这有时可以在后台线程上使用。

需要注意的一点是,当您确实需要修改RealmResults中的数据时,您应该使用迭代器,增强for循环,或者只使用int index向后,或者在快照集合上使用int index。

答案 1 :(得分:1)

只要您提供executeTransaction()

的正确实例,就可以在Realm方法之外使用该查询

For more info, check this out

答案 2 :(得分:1)

您只应在更改Realm对象时使用事务,例如插入/删除/更新它们。

要简单地获取并使用它们而不修改它们,您应该按照第一个示例中的说明进行操作。那很好。

答案 3 :(得分:0)

如果您不想手动关闭realm实例,

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中编写/修改对象才需要它。