データベースが使いたくてSQLiteOpenHelperのonCreateでテーブルつくってデータインサートしてってやってたんだけど、さすがにめんどい。
jsonファイルをassetsに置いてonCreateでデータベースに入れ込むとかもやってみたけど、なんか遅い。
って思ってたらすごくいい記事書いてるサイトを発見。
[Android Programming] sqliteのDBファイルをPCでつくってandroidで使う
やりかた
ざっくり言うと、PCでSQLiteのDBファイル作ってassetsフォルダ突っ込む。SQLiteOpenHelperのgetWritableDatabaseのタイミングでDBをコピー。(俺はgetReadableDatabaseでもコピーするようにした)
public class DbHelper extends SQLiteOpenHelper { private static final String DB_FILE_NAME = "xxx.db"; private static final String DB_NAME = "xxx"; private static final int DB_VERSION = 1; private Context context; private File dbPath; private boolean createDatabase = false; public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.context = context; this.dbPath = context.getDatabasePath(DB_NAME); } @Override public synchronized SQLiteDatabase getReadableDatabase() { SQLiteDatabase database = super.getReadableDatabase(); if (createDatabase) { try { database = copyDatabase(database); } catch (IOException e) { } } return database; } @Override public synchronized SQLiteDatabase getWritableDatabase() { SQLiteDatabase database = super.getWritableDatabase(); if (createDatabase) { try { database = copyDatabase(database); } catch (IOException e) { } } return database; } private SQLiteDatabase copyDatabase(SQLiteDatabase database) throws IOException { // dbがひらきっぱなしなので、書き換えできるように閉じる database.close(); // コピー! InputStream input = context.getAssets().open(DB_FILE_NAME); OutputStream output = new FileOutputStream(this.dbPath); copy(input, output); createDatabase = false; // dbを閉じたので、また開く return super.getWritableDatabase(); } @Override public void onCreate(SQLiteDatabase db) { super.onOpen(db); // getWritableDatabase()したときに呼ばれてくるので、 // 初期化する必要があることを保存する this.createDatabase = true; } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { onUpgrade(db, oldVersion, newVersion); } // CopyUtilsからのコピペ private static int copy(InputStream input, OutputStream output) throws IOException { byte[] buffer = new byte[1024 * 4]; int count = 0; int n = 0; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; } return count; } }
ためになる記事を書いてくれた ipreachableさん に感謝。