使用已关闭的事务编写Realm Daos

时间:2017-08-27 15:26:27

标签: java android realm kotlin

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

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?或者我们应该每次直接从领域实例查询?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

是的,您需要关闭Realm实例,但是您可能需要read the documentation on best practices regarding opening and closing them - 特别是您应该使用onCreate/onDestroy作为Activity / main线程,并且您应该使用try(Realm realm = Realm.getDefaultInstance()) {块对于后台线程,任何需要使用Realm的方法都应该将它作为方法参数传递。

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