Область уже находится в транзакции записи, если я выполняю две транзакции в одном методе - PullRequest
0 голосов
/ 06 февраля 2019

Мне нужно исключить первые записи, записанные в области 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 выдает комментарии, я даже нашел это сообщение , но это слишкомреферат, относящийся к моему делу

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, но затем вставляетвторая запись на постition 0, не в конце списка

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Если я правильно понимаю вашу проблему, вы хотите удалить / удалить первые две записи (если они есть) и вставить новую запись в конец списка. Попробуйте это

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

Пожалуйста, исправьте меня, если я не понял.

0 голосов
/ 06 февраля 2019

Если вы используете executeTransaction, вам не нужно писать вручную beginTransaction() и commitTransaction(), это сделает все за вас.так что в основном вы beginTransaction(), а затем запускаете executeTransaction блок, и вы получаете транзакцию внутри транзакции, вот почему происходит сбой, также вы можете сделать весь этот код в одной транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...