Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果我在同一方法中执行两个事务,则领域已经在写入事务中_Android_Database_Kotlin_Concurrency_Realm - Fatal编程技术网

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()

        }

    }