首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我在同一方法中执行两个事务,则领域已经处于写事务中。

如果我在同一方法中执行两个事务,则领域已经处于写事务中。
EN

Stack Overflow用户
提问于 2019-02-06 07:46:11
回答 2查看 2.9K关注 0票数 0

如果记录的数量超过某一数字,则需要删除由王国db记录的第一批记录,但我得到了这个异常:

代码语言:javascript
复制
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,使用executeTransactionAsyncexecuteTransaction,开始事务处理等等。但是没有什么能起作用,尽管我读了几篇这样的文章和GitHub问题的评论,我甚至发现这是如此post,但太抽象了,与我的案例无关。

代码语言:javascript
复制
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()

代码语言:javascript
复制
    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位置插入第二个记录,而不是在列表的末尾插入第二个记录。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-06 11:17:49

如果我正确理解您的问题,您希望删除/删除前两条记录(如果有),并在列表末尾插入新记录。试试这个

代码语言:javascript
复制
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)
            }
        }
    }
}

如果我理解错了,请纠正我。

票数 1
EN

Stack Overflow用户

发布于 2019-02-06 08:26:32

如果使用executeTransaction,则不需要手动编写beginTransaction()commitTransaction(),而是全部为您编写。基本上,您可以beginTransaction(),然后启动executeTransaction块,然后在事务中得到事务,这就是为什么崩溃,也可以在一个事务中完成所有这些代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54548786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档