Android 如果我在同一方法中执行两个事务,则领域已经在写入事务中
如果域数据库记录的第一个记录超过某个数字,我需要消除这些记录,但我得到了以下例外:Android 如果我在同一方法中执行两个事务,则领域已经在写入事务中,android,database,kotlin,concurrency,realm,Android,Database,Kotlin,Concurrency,Realm,如果域数据库记录的第一个记录超过某个数字,我需要消除这些记录,但我得到了以下例外: 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.re
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
,开始事务等。但是没有任何效果,尽管我读了几篇so帖子和GitHub问题评论,我甚至发现这是如此,但太抽象了,与我的案例无关
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()
现在我得到的结果是,Realm将取消第一个0位置,但随后将在列表的0位置而不是末尾添加下一条记录
如果我取消第二个块
executeTransaction
记录按顺序成功添加,但保留第二个块,则事务将删除第0行,然后在位置0插入第二条记录,如果您使用executeTransaction
,则不必手动编写beginTransaction()
和commitTransaction()
,这一切都可以为您完成。
因此,基本上,您可以
beginTransaction()
然后启动executeTransaction
块,然后在事务内部得到事务,这就是崩溃的原因,您也可以在一个事务中完成所有这些代码。如果您使用executeTransaction
您不需要手动编写beginTransaction()
和commitTransaction()
这一切都是为了你。
所以基本上你
beginTransaction()
然后启动executeTransaction
块,你在事务中得到事务,这就是为什么崩溃,你也可以在一个事务中完成所有这些代码。如果我正确理解你的问题,你想消除/删除前两个记录(如果有)并在列表末尾插入新记录试试这个
fun savedaddress(名称:String,地址:String){
realm.executeTransaction{realm->
val addressToSave=realm.createObject(RecentAddress::class.java)
addressToSave.name=名称
addressToSave.street=地址
//在列表末尾插入记录
realm.insert(addressToSave)
}
deleteOldRecords()
}
有趣的deleteOldRecords(){
realm.executeTransaction{realm->
val recentAddressList=realm.where(RecentAddress::class.java).findAll()
如果(recentAddressList.size>2){
对于(0..1中的i){
recentAddressList.deleteFromRealm(i)
}
}
}
}
如果我理解错误,请更正。如果我正确理解您的问题,您希望消除/删除前两条记录(如果有),并在列表末尾插入新记录试试这个
fun savedaddress(名称:String,地址:String){
realm.executeTransaction{realm->
val addressToSave=realm.createObject(RecentAddress::class.java)
addressToSave.name=名称
addressToSave.street=地址
//在列表末尾插入记录
realm.insert(addressToSave)
}
deleteOldRecords()
}
有趣的deleteOldRecords(){
realm.executeTransaction{realm->
val recentAddressList=realm.where(RecentAddress::class.java).findAll()
如果(recentAddressList.size>2){
对于(0..1中的i){
recentAddressList.deleteFromRealm(i)
}
}
}
}
如果我理解错了,请纠正我。不符合你的建议,因为如果我删除你说的话。Realm将取消数组0,但随后将在数组零位置插入下一条记录,而不是在域列表的末尾,这就是为什么我拼命尝试在不同的事务中对它们进行沙箱处理Realm将取消数组0是什么意思?请@Pavel Poley查看我的编辑。上面我的意思是,就像在那个领域之后,取消RealmObject的第0行,然后在这个零位置插入下一条记录,而不是在
n
顺序位置,我期望(在列表末尾)不会按照您的建议工作,因为如果我删除您所说的内容。Realm将取消数组0,但随后将在数组零位置插入下一条记录,而不是在域列表的末尾,这就是为什么我拼命尝试在不同的事务中对它们进行沙箱处理Realm将取消数组0是什么意思?请@Pavel Poley查看我的编辑。上面我的意思是,就像在该领域取消RealmObject的第0行之后,然后在这个零位置插入下一条记录,而不是在我期望的n
顺序位置(在列表的末尾)好吧,不完全是这样,我希望有一个连续的项目列表,因为我只向用户显示最后的n个,为了不让应用程序数据库变得太大,我想在一段时间后(在示例2中,实际上是10)剪切最旧的记录,现在我得到了由以下原因引起的:java.lang.IllegalStateException:更改域数据只能从事务内部完成。
第行recentAddressList.deleteFromRealm(I)
我认为这应该可以做到,我也试过了。让我知道我必须只删除一条记录,但这并不重要,问题是一旦删除,事务就在[0]的第一个位置创建,而不是在末尾解决了问题,事实上我想将记录保存为最后一条,这并不容易,因此,我恢复了适配器中的列表,现在效果很好。不完全如此,我希望有一个连续的项目列表,因为我只向用户显示最后n个项目,为了不使应用程序数据库太大,我希望在c之后剪切
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()
}
}