В соответствии с просьбой ОП в комментарии к их вопросу вот (для ясности в качестве ответа), что я сделал для проверки производительности:
Перед тем, как вставлять объекты один за другим:
@Dao
abstract class MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insert(items: MyObject): Long
// ...
}
Код синхронизации:
val response = backend.downloadItems() // download from server
val items = response.getData() // this is a List<MyObject>
if (items != null) {
for (i in items) {
myDao.persist(s)
}
}
Это заняло минуту на Huawei P10 +.
Я изменил это на:
@Dao
abstract class MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insert(items: Iterable<MyObject>)
// ...
}
Код синхронизации:
val response = backend.downloadItems() // download from server
val items = response.getData() // this is a List<MyObject>
response.getData()?.let { myDao.insert(it) }
Это заняло меньше секунды.
Смысл здесь в том, чтобы конкретно использовать Iterable<>
версию метода DAO @Insert
, который, как сказал @iDemigod,использует Iterable<>
версию EntityInsertionAdapter
.
. Тело указанной функции находится в ответе @ iDemigod и использует один подготовленный оператор для всех вставок.
Анализ SQLв оператор стоит дорого, и использование оператора создает транзакцию для всего пакета вставки, что может помочь решить другие проблемы (у меня было заметное значение LiveData<>
в базе данных, которое было уведомлено 12 раз при вставке ... производительность была ужасно ).