如果记录的数量超过某一数字,则需要删除由王国db记录的第一批记录,但我得到了这个异常:
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问题的评论,我甚至发现这是如此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()
}
}现在我知道了,这就像领域将取消第一个0位置,但是接下来将在0位置中添加下一个记录,而不是在列表的末尾添加下一个记录。
如果我取消了第二个块executeTransaction,记录将按顺序成功地添加,但保留第二个块,事务删除行0,然后在0位置插入第二个记录,而不是在列表的末尾插入第二个记录。
发布于 2019-02-06 11:17:49
如果我正确理解您的问题,您希望删除/删除前两条记录(如果有),并在列表末尾插入新记录。试试这个
fun savedAddresses(name: String, address: String) {
realm.executeTransaction { realm ->
val addressToSave = realm.createObject(RecentAddress::class.java)
addressToSave.name = name
addressToSave.street = address
//insert the record at the end of the list
realm.insert(addressToSave)
}
deleteOldRecords()
}
fun deleteOldRecords() {
realm.executeTransaction { realm ->
val recentAddressList = realm.where(RecentAddress::class.java).findAll()
if(recentAddressList.size > 2){
for(i in 0..1) {
recentAddressList.deleteFromRealm(i)
}
}
}
}如果我理解错了,请纠正我。
发布于 2019-02-06 08:26:32
如果使用executeTransaction,则不需要手动编写beginTransaction()和commitTransaction(),而是全部为您编写。基本上,您可以beginTransaction(),然后启动executeTransaction块,然后在事务中得到事务,这就是为什么崩溃,也可以在一个事务中完成所有这些代码。
https://stackoverflow.com/questions/54548786
复制相似问题