用关闭的交易来写Realm Daos

我们已经开始将Realm集成到我们的android项目中,并遇到了一个小问题。 我们已经用“领域”重写了我们的道,例如:

public class RealmAuthDao { public static RealmAuthToken getAuthToken() { Realm realm = RealmFactory.getAuthInstance(); RealmAuthToken token = realm.where(RealmAuthToken.class).findFirst(); return token; } 

但每隔几分钟就有以下例外 –

“不可恢复的错误。在io_realm_internal_SharedGroup.cpp中打开的文件过多”

我们已经意识到,我们需要关闭在应用程序中打开的每个领域实例,所以我们尝试了这个:

 public class RealmAuthDao { public static RealmAuthToken getAuthToken() { Realm realm = RealmFactory.getAuthInstance(); RealmAuthToken token = realm.where(RealmAuthToken.class).findFirst(); realm.close // close the instance we were using return token; } 

但是,当我们这样做的时候,每当我们试图访问我们查询的对象的成员或属性时,它就变成无效的,并抛出下面的异常:

“这个Realm实例已经关闭了,使它无法使用。”

有没有适当的方法来实现道的领域? 或者我们应该每次直接从领域实例查询?

我所做的是在我的活动中获得我领域对象的实例,并将其传递给dao类来进行查询。 他们关闭实例后,我的活动停止,它的工作很好,我的道方法不是静态的,所以我需要和实例的道,并通过领域对象作为构造参数。

是的,你需要关闭Realm实例,但是你可能想要阅读有关打开和关闭它们的最佳实践的文档 – 特别是你应该使用onCreate/onDestroy作为Activity /主线程,你应该使用try(Realm realm = Realm.getDefaultInstance()) { block为后台线程,任何需要使用Realm的方法都应该把它作为方法参数传递。

 public static RealmAuthToken getAuthToken(Realm realm) { return realm.where(RealmAuthToken.class).findFirst(); }