だいぶ今更な内容ではありますが、Androidのバージョンによって搭載されているSQLiteのバージョンが異なります。
それによって一部仕様の違いがあり、場合によってはプログラムのかき分けが必要となります。
Androidに搭載されているSQLiteのバージョン
API level | SQLiteバージョン |
---|---|
14、15 | 3.7.4 |
16~20 | 3.7.11 |
他は以下を参照
AndroidでのSQLiteバージョン
3.7.4と3.7.11での差分
Bulk Insertの対応
SQLiteバージョン | 対応 |
---|---|
3.7.4 | × |
3.7.11 | ◯ |
3.7.4ではBulk Insertに対応していないため、API level 15以下では以下の様なインサート文が書けない
INSERT INTO table (a, b, c) VALUES (1, 2, 3), (4, 5, 6), ....
そのため、API level 15と16以降を共存させる場合はクエリの書きわけが必要となる。
一行ずつのインサートはパフォーマンスがよくないためできるだけBulk Insertを用いるのがよいが
バージョンの差分により実行できないため、せめてトランザクションを貼ってのループ処理が良い。
トランザクションをはらずに一行ずつの実行は非常にコストが高い(一行の実行ずつにトランザクションが貼られてしまうため)。
public void insertAll(List<String> dataList) {
SQLiteDatabase db = ...;
...
db.beginTransaction();
for (String data : dataList) {
// インサート処理。Prepared StatementあるいはContentValuesなどを使用。
}
db.endTransaction();
}