@lacredin
Программист

Почему могут различаться результаты select в Realm?

Всем привет!

В моём проекте есть два основных места использования Realm. Базовое почти для всех фрагментов activity и сервис, который отвечает за обмен данных с сервером.
Столкнулся с проблемой того, что данные, записанные в БД в activity, могут быть не доступны в сервисе. При этом, если вытащить из телефона непосредственно файл самой БД, то там всё записано правильно. Сам сервис тоже всё записывает правильно.

Случается это если перед базовым activity, был activity авторизации и находящийся в нём фрагмент.
Если activity авторизации был, то сервис впервые запускается из фрагмента авторизации, если нет, то из базового activity.

Шаблон чтения и записи в БД у меня вот такой:

abstract class DbRequest<T : RealmObject> {

    fun saveList(organisations: List<T>) = RealmConfigDB.getInstance().use {
        it.executeTransaction { realm ->
            organisations.forEach { realm.copyToRealmOrUpdate(it) }
        }
    }

    protected open fun select(namePrimaryKey: String, primaryKey: String, clazz: KClass<T>) = RealmConfigDB.getInstance().where(clazz.java).equalTo(namePrimaryKey, primaryKey).findFirst()?.let {
        it.realm.copyFromRealm(it)
    }

    protected fun selectAll(clazz: KClass<T>): MutableList<T>? = RealmConfigDB.getInstance().where(clazz.java).findAll()?.let {
        it.realm.copyFromRealm(it)
    }

    protected fun delete(namePrimaryKey: String, primaryKey: String, clazz: KClass<T>) = RealmConfigDB.getInstance().use {
        it.executeTransaction {
            it.where(clazz.java).equalTo(namePrimaryKey, primaryKey).findAll().deleteAllFromRealm()
        }
    }

    protected fun clearAll(clazz: KClass<T>) = RealmConfigDB.getInstance().use {
        it.executeTransaction {
            it.where(clazz.java).findAll().deleteAllFromRealm()
        }
    }

    protected fun selectList(nameKey: String, key: String, clazz: KClass<T>): MutableList<T>? = RealmConfigDB.getInstance().where(clazz.java).equalTo(nameKey, key).findAll()?.let {
        it.realm.copyFromRealm(it)
    }
}

interface DbRequestInterface {
    fun currentSave(tableObject: RealmObject) = RealmConfigDB.getInstance().use {
        it.executeTransaction {
            it.copyToRealmOrUpdate(tableObject)
        }
    }

    fun <T : RealmObject> currentDelete(namePrimaryKey: String, primaryKey: String, clazz: KClass<T>) = RealmConfigDB.getInstance().use {
        it.executeTransaction {
            it.where(clazz.java).equalTo(namePrimaryKey, primaryKey).findFirst()?.deleteFromRealm()
        }
    }
}
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 1
@lacredin Автор вопроса
Программист
Как в комментариях заметил aelimill, надо закрывать работу с eralm после выполнения какой либо операции
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы