Android DBをAssetsに入れてアプリで使う
2014/06/02
参照だけのDBをassetsから直接使いたいと考え、ネットの海でぐるぐる巡ってみたけど、assetから直接開くやり方はないみたい。
一旦、コピーして使うというのが常識(?)みたい。
以下は既存のDBを初めからアプリに入れておき、コピーして使うやり方。
他にもファイルを作ってSQLを流し込む的なやり方もあります。
- assetsに既存のDBをインポート
- assetsに入れたままでは使えないので、アプリ内の適当な場所へコピーする。
/data/data/com.hoge.foo/files/foo.db
※filesではなくて普通はdatabasesらしいけど、権限の問題で書き込みできないからfilesに置く。 - プログラム内で、コピーする記述を書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | String DB_PATH = "/data/data/com.hoge.foo/files/"; String DB_NAME = "data.db"; private boolean checkDataBaseExists() { File dbFile = new File(DB_PATH + DB_NAME); return dbFile.exists(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (!checkDataBaseExists()) { try { InputStream myInput = getResources().getAssets().open(DB_NAME); String outFileName = DB_PATH + DB_NAME; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[2048]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); } catch (IOException e) { e.printStackTrace(); } } } |
- Sqlite3でDBに接続する。
※ 最後の引数がSQliteDatabase.NO_LOCALIZED_COLLATORSでないと怒られる。
1 2 | SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS); |
- データを引っ張ってくる。
※ whereやgroup byやorder byを別々に書くので、面倒な方はベタ書きで。
1 | Cursor res = db.query("テーブル名",new String[] { "項目名", "項目名" }, "面倒なのでwhere以下全部記述", null, null, null, null); |
もしかしたら、DBのパスあたりは機種依存があるかもしれませんね。
適当に改造してお使いください。