Массовая вставка SQLite (100 - 1000 строк за раз) с использованием db.execSQL или с помощью Statement.bind (у меня есть 20000 записей и 7 столбцов) - PullRequest
0 голосов
/ 02 апреля 2019

Нужно вставить объемные данные в 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();
    }

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

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

0 голосов
/ 02 апреля 2019

Вы можете вставить только одну строку за раз.Итак, вычеркнув странные вещи из вашего кода и включив бит, который я упомянул в комментарии об однократном связывании только константных значений (Отказ от ответственности: это будет работать в 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 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...