Массовая вставка SQLite (100–1000 строк одновременно) с использованием db.execSQL или с помощью Statement.bind (у меня есть 20000 записей и 7 столбцов)

-3

Нужно вставить объемные данные в SQLite (100-500 записей одновременно... по 7 столбцов, в каждой строке будет 7 значений)

Использование statment.bind Plz предлагает, если что-то не так, и hw реализовать с помощью пакетной вставки db.execSQL.

    SQLiteDatabase db = DBHelper.getWritableDatabase();
    String  str = "INSERT INTO DBAdapter.KEY_BD1_DB_NAME(a, b, c, d, e, f,g) VALUES(?, ?, ?, ?, ?, ?,?)";
    SQLiteStatement statement = db.compileStatement(str);


    db.beginTransactionNonExclusive();

    try {


        for (int i=0;i<arraylist.length;i++)
        {

            statement.bindLong(1, id);
            statement.bindLong(2, alist[i]);
            statement.bindLong(3, blist[i]);
            statement.bindString(4, strTStamp[0]);
            statement.bindString(5, strTStamp[1]);
            statement.bindLong(6, j);
            statement.bindLong(7, tstamp);




            if (alist.size>100)
            {
                if(count==100)
                {
                    statement.executeInsert();
                    statement.clearBindings();
                    count=0;
                }
                else
                {
                    count++;
                }


            }



        }
        statement.executeInsert();
        statement.clearBindings();
        db.setTransactionSuccessful();


        Log.d("INSERT","Done");
        return true;
    } catch (SQLException ex) {
        Log.w("SqlErr", "At kkr : " + ex.toString());
        return false;
    }finally {
        db.endTransaction();
        db.close();
    }
  • 0
    что-то не так с вашим кодом? Работает? какой вопрос? пожалуйста, уточните, с какой проблемой вы столкнулись, что вы пробовали и т. д.
  • 0
    Вышеупомянутый код будет выполнять настройку производительности для массовой вставки ?? ... требуется время для вставки данных в db ..... hv для вставки не менее 100 строк одновременно
Показать ещё 5 комментариев
Теги:
query-performance
bulkinsert

2 ответа

0

Вы можете вставить только одну строку за раз. Итак, вычеркнув странные вещи из вашего кода и включив бит, который я упомянул в комментарии об однократном связывании только константных значений (Отказ от ответственности: это будет работать в C; не на 100% уверен в привязках java/android), стандартный подход к вставить кучу данных должно выглядеть примерно так:

SQLiteDatabase db = DBHelper.getWritableDatabase();

db.beginTransaction();
try {
    String  str = "INSERT INTO DBAdapter.KEY_BD1_DB_NAME(a, b, c, d, e, f,g) VALUES(?, ?, ?, ?, ?, ?,?)";
    SQLiteStatement statement = db.compileStatement(str);

    statement.bindLong(1, id);
    statement.bindString(4, strTStamp[0]);
    statement.bindString(5, strTStamp[1]);
    statement.bindLong(6, j);
    statement.bindLong(7, tstamp);

    for (int i=0;i<arraylist.length;i++) {
            statement.bindLong(2, alist[i]);
            statement.bindLong(3, blist[i]);
            statement.executeInsert();
    }

    db.setTransactionSuccessful();
    Log.d("INSERT","Done");
    return true;
} catch (SQLException ex) {
    Log.w("SqlErr", "At kkr : " + ex.toString());
    return false;
} finally {
    db.endTransaction();
    db.close();
}

Другие вещи:

  • PRAGMA синхронно = OFF может быть быстрее, но это сопряжено с риском.
  • Стандартный прием массовой вставки заключается в удалении любых индексов в таблице, вставке данных и последующем повторном создании индексов.
  • При использовании внешних ключей временное отключение их принудительного применения во время массовой вставки также может ускорить процесс. Только не забудьте искать проблемы позже с PRAGMA foreign_key_check.
  • 0
    Спасибо тебе большое, Шон
0

Похоже, вы пытаетесь заполнить базу данных при первом использовании. Но вместо этого было бы гораздо лучше, быстрее и проще просто поставить ваше приложение с готовым к использованию файлом базы данных в ресурсах вашего приложения assets/ а затем, при первом использовании, просто использовать вместо этого эту БД для "заполнения". Есть несколько вспомогательных библиотек, которые помогают с этим: https://github.com/jgilfelt/android-sqlite-asset-helper

  • 0
    Спасибо Марцин ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню