Управление базой данных в Android (часть 2)

В процессе работы с sqlite базой выяснилось, что не всё так просто, как казалось в [[http://blog.arkoniak.com/?p=181|Управление базой данных]]. Выяснилось несколько особенностей реализации sqlite под андроидом.

# Начиная с какой-то (видимо довольно древней) версии android, все sql запросы по умолчанию оборачиваются в транзакцию. Поэтому нельзя ставить “BEGIN TRANSACTION”, “COMMIT”, вместо этого надо использовать beginTransaction(), setTransactionSuccessful() и endTransaction(). В этом случае компилятор самостоятельно правильным образом расставит точки сохранения и откатов.
# Драйвер sqlite, как выяснилось не поддерживает множественные запросы в одной команде, то есть если будет передана последовательность команд разделённых точкой с запятой, то выполнится только самая первая. Это решать можно многими разными способами, я сделал максимально примитивно и группирую запросы в массив, по которому затем последовательно пробегаю в цикле. Возможно имеет смысл сделать какую-то более изящную конструкцию, но в принципе работает и так.

{{{lang=java
String sql_query_1 = “SOME QUERY;”;
String sql_query_2 = “SOME OTHER QUERY;”;
String[] queries = new String[]{sql_query_1, sql_query_2};

….
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
db.beginTransaction();
try{
for (String str : queries){
db.execSQL(str);
}
db.setTransactionSuccessful();
}
catch (Exception e){
// Exception processing
}
finally{
db.endTransaction();
}
}
}
}}}