2012年11月7日水曜日

SQLiteの定義済みのファイルを使う

 SQLite は、ファイルベースのため、対象ファイルを指定することによって簡単に別のデータべヘスにアクセス出来る。と言うよりも、むしろ、目的でファイルに分けると言った感じです。そうなるとすぐに思い当たるのが、データベースを定義しておきこのファイルをそのまま使えないのかということ。少しものぐさかもしれませんが時間短縮にもなるし、SQLiteのGUIベース管理ツールで管理していると真っ先に思いつくことなので、色々と調べてみました。するとやはりありました。
 やり方は至って簡単で、 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カードへの保存ができません。







0 件のコメント:

コメントを投稿