我想知道..在领域事务之外查询某些对象是一个好习惯吗?我的意思是,我不想修改那个对象,我只想获取对象并查看其数据。
这段代码做得好吗?
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();
}
});
如果我想在交易之外使用该项目,会发生什么?因为我无法从该交易外部访问它。最好的方法是什么?
答案 0 :(得分:2)
交易用于修改数据,又称"写交易"。
您不需要他们开始阅读数据。
如果在任何其他线程/进程上存在打开的写事务,则开始写事务会阻塞该线程。但是当你开始时它会将版本颠覆到最新版本,这有时可以在后台线程上使用。
需要注意的一点是,当您确实需要修改RealmResults中的数据时,您应该使用迭代器,增强for循环,或者只使用int index向后,或者在快照集合上使用int index。
答案 1 :(得分:1)
答案 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
}
您无需使用executeTransaction
进行阅读。只有在Realm中编写/修改对象才需要它。