如何在android的Realm中实现以下function

在我的应用程序中,我通常有一个加载器,它从sqlite加载数据,然后将其传递到它所附加的活动或片段,从它在absListView的适配器中设置的位置传递给用户

由于领域声明,它的对象不应该在线程之间共享 ,如何在不从UI线程进行任何数据库调用的情况下实现呢? (这会让应用程序感觉呆滞,因为我打了一个很好的数据库)

同样在3个例子 – intro , gridView和migration中 ,很多次db操作都是在UI线程中完成的。 在UI线程中的数据库操作是不是严重皱眉在Android?

从文档中引用 – 可能长时间运行的操作(如networking或数据库操作)或计算量大的计算(如调整位图大小)应在工作线程(或在数据库操作的情况下,通过asynchronous请求)完成。

Solutions Collecting From Web of "如何在android的Realm中实现以下function"

您是对的,目前无法在后台线程中加载项目,然后将其parsing到UI线程。 然而,在路线图上,请看这里: https : //github.com/realm/realm-java/issues/503

领域是相当快的,所以在那之前,对于较小的数据量,即使在UI线程中加载数据,也可能不会跳过帧。

当我第一次在他们的网站上读到关于领域的东西时,我非常兴奋地看到他们的基准testing。 但是,当我回到限制部分时,我在那里呆了2分钟,正在考虑“跨线程的对象共享预防”。 从里面,它告诉我,去的境界,但这种局限性让我失望。 所以最后我决定实现某种包装,允许我在所有线程中共享这个对象。

这是事情。 读取和写入磁盘的过程需要更多的时间,然后简单的对象创build 。 这是我用包装创build进行的一点。

1)我保留允许创buildRealmObject的子类的对象反对他们的对象访问规则在创build它的同一个线程。

例如

XyzsubclassofRealmObject xyzObject = new XyzsubclassofRealmObject(); 

2)将该对象传递给执行数据库操作的方法

例如

 insertOrUpdate(xyzObject); //implementation insertOrUpdate(XyzsubclassofRealmObject object) //you can make this method generic to accept any object that is subclass of RealmObject { Realm realm = Realm.getDefaultInstance(); realm.beginTransaction(); XyzsubclassofRealmObject databaseObject = realm.copyToRealmOrUpdate(object); //notice this copyToRealmOrUpdate method provides by Realm realm.commitTransaction(); XyzsubclassofRealmObject copyObject = clone(databaseObject); return copyObject; } 

3)现在他们也提到了两点

  • RealmObject的子类只有默认的getter和setter方法,如果需要我们的其他逻辑,允许使用静态方法。 感谢上帝他们允许静态的方法。 🙂

  • 它可以实现没有方法的接口。 🙁

我正在考虑克隆从copyToRealmOrUpdate返回的databaseObject。 作为没有方法的接口允许(即第二点),第一点来帮助我。

 public static XyzsubclassofRealmObject clone(XyzsubclassRealmObject databaseObject) { XyzsubclassOfRealmObject obj = new XyzsubclassofRealmObject(); obj.setXyz(databaseObject.getXyz()); return obj; } 

而不是像这里所示直接调用克隆方法,我用reflection方法调用克隆方法,因为我写generics包装来执行数据库操作,而不是特定的模型。 你可以自由select你自己的方式

而已。 你完成了。 如您所见,我们正在返回复制对象而不是数据库对象,您可以在任何线程上自由使用它。 🙂

结论:许多博客和博文都表示,在性能上如此之快,在执行事务时在UI线程上使用它是很好的。 但是select取决于你。 事先并不知道在应用程序使用量增加的时候有多less数据从数据库进出。 如果该交易将有足够的数据,使您的用户界面呆滞,它会。 同样,我们所有的开发人员都有练习在工作线程而不是UI线程上执行数据库和networking操作,所以它不会停止任何UI交互。

读取和写入磁盘的过程需要更多的时间,然后简单的对象创build