やり方は至って簡単で、 asset フォルダに使いたいデータベースファイルを設置しておき、データベースを開く前にコピーしてやるといい。コンストラクタ時はファイルはなくてもいいので、オープンする直前でいい。
Context.getDatabasePath(String name)
メソッドで指定したデータベースが存在するパスを取得して、
SQLiteDatabase.openDatabase(String path, CursorFactory factory, int flags)
メソッドを使って、android のストレージにファイルが有るかをチェックします。このメソッドは、ファイルが無ければ例外を返してくるので、オブジェクトを返さなかったらファイルが無かったと処理させれば良い。
ファイルが存在していないのならば、FileStream を使って、android のストレージへコピーすれば良い。しかし、ここで、勘の良い人は気づくと思います。
「どこに保存されるの?」
そう、保存されるのば内蔵メモリの領域。場所はインストールされたアプリケーションごとの領域です。せっかくSDカードがあるのに気持ち悪いですよね。そんな時は、SDカードがマウントされているなら、内蔵ではなく、そっちにコピーする方法あります。
まずは、以下のメソッドでSDカードがマウントされているかをチェックします。
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)
これが、true を返せば、SDカードはマウントされています。以下のメソッドでマウント先のパスを取得します。
Environment.getExternalStorageDirectory()
取得した下に適当なディレクトリを付加したパスをデータベースファイルに付加して存在チェックを行い、なければそこにコピーという手順で任意のフォルダへコピーできます。
ここで、注意しなければならないことは、permission でSDカードを許可しないと行けません。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
タグを追加して、アプリケーションがSDカードにアクセスすることを許可しないとSDカードへの保存ができません。