Всем привет!
В моём проекте есть два основных места использования 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()
}
}
}