Android sqlite и несколько запросов - PullRequest
2 голосов
/ 12 августа 2011

Чтобы заполнить мою базу данных, у меня есть несколько таких циклов:

for (int i=0;i<something;++i){
   myDatabase.insert(...);
}

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

String queries="";
for (int i=0;i<something;++i){
   queries += "my query;";
}
myDatabse.execSQL(queries);

Но функция execSQL вставляет только первый запрос, а не другие. Так как я могу это сделать?

Ответы [ 3 ]

9 голосов
/ 12 августа 2011

Вы должны выполнить все запросы через одну транзакцию:

db.beginTransaction();
try {
    ...
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}
4 голосов
/ 12 августа 2011

Вы пытались вставить несколько строк в одном выражении? Примерно так:

INSERT INTO table (c1, c2, c3) VALUES
(1, 2, 3),
(4, 5, 6),
....

Вы также можете попробовать обернуть вставки в одну транзакцию . Объединение всей вашей работы в одну транзакцию должно исключать накладные расходы на блокировку вставки.

3 голосов
/ 12 августа 2011

Вы можете попытаться заключить эти строки вставки в транзакции «BEGIN» и «COMMIT». SQLite упаковывает все вызовы DML и DDL в блок транзакций, создает журнал транзакций и, например, после вставки удаляет его, и это будет повторяться снова (в случае вашего первого примера кода).

Когда вы вручную выполняете команды TCL, база данных SQLite выходит из режима авто-транзакции и будет делать то, что вы говорите, чтобы сделать.

...