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

Android: массовая вставка, когда InsertHelper устарела

Существует много ответов и руководств, использующих InsertHelper для быстрой вставки в SQLiteDatabase. Но InsertHelper устарел от API 17.

Что представляет собой самый быстрый способ для массового ввода больших наборов данных в Android SQLite?

До сих пор моя самая большая проблема заключалась в том, что SQLiteStatement не очень удобно работать, где InsertHelper имеет обязательные столбцы и значения привязки, что было немного тривиальным.

4b9b3361

Ответ 1

SQLiteStatement также имеет методы привязки, он расширяет SQLiteProgram.

Просто запустите его в транзакции:

    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    final SQLiteStatement statement = db.compileStatement(INSERT_QUERY);
    db.beginTransaction();
    try {
        for(MyBean bean : list){
            statement.clearBindings();
            statement.bindString(1, bean.getName());
            // rest of bindings
            statement.execute(); //or executeInsert() if id is needed
        }
        db.setTransactionSuccessful();
    } finally {
        db.endTransaction();
    }

ИЗМЕНИТЬ

Я не могу найти хорошее решение в SQLiteQueryBuilder, но это просто:

final static String INSERT_QUERY = createInsert(DbSchema.TABLE_NAME, new String[]{DbSchema.NAME, DbSchema.TITLE, DbSchema.PHONE});

static public String createInsert(final String tableName, final String[] columnNames) {
    if (tableName == null || columnNames == null || columnNames.length == 0) {
        throw new IllegalArgumentException();
    }
    final StringBuilder s = new StringBuilder();
    s.append("INSERT INTO ").append(tableName).append(" (");
    for (String column : columnNames) {
        s.append(column).append(" ,");
    }
    int length = s.length();
    s.delete(length - 2, length);
    s.append(") VALUES( ");
    for (int i = 0; i < columnNames.length; i++) {
        s.append(" ? ,");
    }
    length = s.length();
    s.delete(length - 2, length);
    s.append(")");
    return s.toString();
}

Ответ 2

Я рекомендую вам взглянуть на google приложение IO, особенно provider, так это делают разработчики Google, поэтому вы можете быть уверены, что этот является правильным способом.

Ответ 3

Я столкнулся с той же проблемой и не смог найти, как SQLiteStatement может легко заменить DatabaseUtils.InsertHelper, поскольку вам нужно вручную создать запрос SQL.

В итоге я использовал SQLiteDatabase.insertOrThrow, который может легко заменить существующий код. Мне приходилось иногда добавлять пустой столбец для обработки случаев, когда я вставляю пустые ContentValues.

Да, инструкция не скомпилирована для повторного использования позже, но создание запроса INSERT вручную и привязка всех параметров - это слишком большая боль. Мне было бы интересно узнать, насколько это влияние влияет на большой объемный набор данных вставки (InsertHelper только устарел), если вы изменяете свой код.

Ответ 4

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

Я уверен, что это устарело, чтобы очистить классы утилиты SDK. То, что осталось с моим классом, - это использование не устаревших вещей.