参照だけの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のパスあたりは機種依存があるかもしれませんね。
適当に改造してお使いください。