Подтвердить что ты не робот

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

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

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

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

Каждый 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 байт в сек./Мс)

Любые идеи?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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