AndroidOS Androidアプリ

Android DBをAssetsに入れてアプリで使う

参照だけのDBをassetsから直接使いたいと考え、ネットの海でぐるぐる巡ってみたけど、assetから直接開くやり方はないみたい。

一旦、コピーして使うというのが常識(?)みたい。

以下は既存のDBを初めからアプリに入れておき、コピーして使うやり方。
他にもファイルを作ってSQLを流し込む的なやり方もあります。

  • assetsに既存のDBをインポート
  • assetsに入れたままでは使えないので、アプリ内の適当な場所へコピーする。
    /data/data/com.hoge.foo/files/foo.db
    ※filesではなくて普通はdatabasesらしいけど、権限の問題で書き込みできないからfilesに置く。
  • プログラム内で、コピーする記述を書く。
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でないと怒られる。
SQLiteDatabase db = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME,
null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
  • データを引っ張ってくる。
    ※ whereやgroup byやorder byを別々に書くので、面倒な方はベタ書きで。
Cursor res = db.query("テーブル名",new String[] { "項目名", "項目名" }, "面倒なのでwhere以下全部記述", null, null, null, null);

もしかしたら、DBのパスあたりは機種依存があるかもしれませんね。
適当に改造してお使いください。

-AndroidOS, Androidアプリ
-, , , , ,

Copyright© LAPTURE , 2020 All Rights Reserved.