Почему InsertHelper устарел?

Я потратил довольно много времени на некоторые проблемы с производительностью на нашем устройстве и заметил, что у нас есть довольно много приложений, которые все делают db для чтения / записи.

Я начал с использования API контактов для вставки новых контактов и строк данных, и это было очень медленно. 1 минута 18 секунд, чтобы вставить около 1500 строк (250 сырых контактов и 1250 строк данных).

Я использовал помощник вставки в другом приложении для вставок производительности и решил написать тестовое приложение, которое записывало бы отдельные методы вставки db.

Каждый db имеет одну таблицу, каждый w / 4 столбца: _ID, Name, Time и Blob (весь тип «строка») – точно так же, как поставщик контактов определяет столбцы данных.

_ID – auto increment pk, Name просто вставляет то же самое «1234567890», время – это только текущее системное время в milis, а BLOB – это строка длиной 6400, заполненная буквой «A» …

Сначала я проверил объемную вставку, но все, что она делает, – это петли через все введенные вами вставки и так же медленны, как и вставки отдельно (или незначительное влияние на производительность).

Я тестировал 3 разных метода для вставки: ContentValues ​​w / db.insert метод: SQLiteStatement w / statement.execute () (выполняется внутри транзакции). SqliteInsertHelper с транзакцией.

Я могу предоставить некоторый код, но я получил лучшую производительность из InsertHelper и задаюсь вопросом, почему это было устарело:

Время для вставки 100 записей ContentValues: 7,778 секунд (82 байта написано / мс) SQLiteStatement: 1,311 секунды (489 байт написано / мс) SqliteInsertHElper: 0,292 секунды (2197 байт написано / мс)

Есть идеи?

InsertHelper позволяет пользователям делать несколько вставок в таблицу, используя тот же оператор. Но это не очень хороший способ вставить как таковой, поскольку он not thread-safe является not thread-safe .

Трудно найти какую-либо информацию о том, почему InsertHelper устарел, не переходя к фактическому фиксации, который его осуждает. Инженер, который отказался от InsertHelper, дал следующую причину:

Этот класс не дает никаких преимуществ перед SQLiteStatement и просто делает код более сложным и подверженным ошибкам.

После рефакторинга из InsertHelper в SQLiteStatement я согласен. Одно исключение – для нулевых функций привязки. В то время как InsertHelper автоматически вызывает bindNull () для вас, SQLiteStatement сбой, если вы передаете, например, нулевую строку, и вам нужно выполнить свою нулевую проверку перед вызовом bindString ().

См. https://android.googlesource.com/platform/frameworks/base/+/b33eb4e%5E!/

Вы должны использовать транзакции. , Если вы явно не создаете транзакцию для операции с базой данных, фреймворк создает по одному для каждого. Сгруппируйте свой объект и вставьте его сразу. Это значительно повысит производительность.

Intereting Posts
Ошибка «Не удалось загрузить библиотеку SSL» на Android с помощью TidHTTP Приложение Cordova не может загружать файлы в активы / www (only index.html) Удалить поле в значке панели инструментов Android Android – создание слайдера для слайда слева направо Android Volley Возвращает результаты дважды для одного запроса Как создать представление таблицы с несколькими столбцами в android с помощью java-кода? Как я могу показать виджет Android App Label / Name В Android, как разместить изображение поверх другого, чтобы выглядеть как значок? Документы или руководства по android.graphics.Camera и android.graphics.Matrix? Взлом Android Fragment View State Loss при использовании FragmentTransaction.replace () Что такое @ ViewDebug.ExportedProperty точно? Исключение из памяти при анализе ответа 5MB JSON на Android Где документация filtercript (и как я могу ее использовать)? Замена для Android Mapview для использования службы WMS Как я могу очистить значение TextView?