【发布时间】:2019-02-06 07:46:11
【问题描述】:
如果它们超过一定数量,我需要消除领域数据库记录的第一条记录,但我得到了这个异常:
Caused by: java.lang.IllegalStateException: The Realm is already in a write transaction in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 126
at io.realm.internal.OsSharedRealm.nativeBeginTransaction(Native Method)
at io.realm.internal.OsSharedRealm.beginTransaction(OsSharedRealm.java:269)
at io.realm.BaseRealm.beginTransaction(BaseRealm.java:404)
at io.realm.Realm.beginTransaction(Realm.java:145)
at io.realm.Realm.executeTransaction(Realm.java:1491)
atsavedAddresses(AddressBook.kt:39)````
正如您在下面看到的,我尝试添加commitTransaction,与executeTransactionAsync 和executeTransaction 一起玩,开始交易等。但是尽管我阅读了几篇这样的帖子并且GitHub 发布了cmets,但没有任何效果,我甚至发现这个post 但太抽象了,无法与我的案例相关
init {
Realm.init(ProActiveApplication.applicationContext())
}
private val realm = Realm.getDefaultInstance()
val query = realm.where(RecentAddress::class.java).findAll()
fun savedAddresses(name: String, address: String) {
realm.beginTransaction()
realm.executeTransactionAsync {
val addressToSave = realm.createObject(RecentAddress::class.java)
addressToSave.name = name
addressToSave.street = address
Log.d("ME","-----------------")
Log.d("ME", " CreateTransaction: ${addressToSave.name} in ${addressToSave.street}")
Log.d("ME","-----------------")
}
realm.commitTransaction()
realm.close()
realm.beginTransaction()
realm.executeTransaction {
if (query.size > 2) {
val location = query.get(0)
Log.d("ME","-----------------")
Log.d("ME", " This is cancelled: ${query.get(0)}")
Log.d("ME","-----------------")
location?.deleteFromRealm()
} }
编辑
按照建议,我将删除 beginTransaction() 和 commitTransaction,我也改为 executeTransaction 而不是 `executeTransactionAsync()
fun savedAddresses(name: String, address: String) {
// realm.beginTransaction()
realm.executeTransaction {
val addressToSave = realm.createObject(RecentAddress::class.java)
addressToSave.name = name
addressToSave.street = address
Log.d("ME", "-----------------")
Log.d("ME", " CreateTransaction: ${addressToSave.name} in ${addressToSave.street}")
Log.d("ME", "-----------------")
}
// realm.commitTransaction()
realm.close()
// realm.beginTransaction()
realm.executeTransaction {
if (query.size > 2) {
val location = query.get(0)
Log.d("ME", "-----------------")
Log.d("ME", " This is cancelled: ${query.get(0)}")
Log.d("ME", "-----------------")
location?.deleteFromRealm()
}
}
现在我明白了,就像 Realm 将取消第一个 0 位置,但随后将在 0 位置添加下一条记录而不是列表的末尾
如果我取消第二个块executeTransaction,记录按顺序添加成功,但保留第二个块,事务消除第0行,然后在位置0插入第二条记录,而不是在列表的末尾
【问题讨论】:
标签: android database kotlin concurrency realm