用关闭的交易来写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(); }