ラベル SQLite の投稿を表示しています。 すべての投稿を表示
ラベル SQLite の投稿を表示しています。 すべての投稿を表示

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カードへの保存ができません。







SQLite を使う。

 アプリといえば必ずついて回るのがデータをどうするか。簡単なアプリでもデータを管理するのには悩みます。しかし、Android は標準でSQLite 対応しているので、これを使わない手はありません。

SQLiteOpenHelper
SQLiteDatabase

これらの2つ使えば、簡単にSQLite データベースが使えます。

 SQLiteOpenHelper は、これをスーパークラスとしたサブグラスを作成し、サブラスのコンストラクタでスーパークラスのコンストラクタを呼ぶようにし、以下のメソッドをオーバーライドします。

public void onCreate(SQLiteDatabase db)
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

 これらは、抽象化されたメソッドなので、必ずオーバーライドして実装する必要があります。また、コンストラクタですが、スーパークラスでは、

SQLiteOpenHelper(Context context, String name,  CursorFactory factory, int version)

 として、定義されてます。
 サブクラスのコンストラクタでは、必要な引数のみ受けるようにして、スーパークラスのメソッド呼ぶ時に加工して呼ぶのが良いです。
 ここで、色々な文献をみてもしっくり来ないのが、CursorFactory です。どうやら、独自のクエリの結果セットを使う時に指定するらしいのですが、そのようなことはまずないので null 指定でOKだとか、まあ、問題ないならばそれ以上は追求しないことに。
 最後の version も、バージョン管理するまでもないものには 1 でいいでしょう。

 さて、SQLiteDatabase がどこかに行ってますが、これは、SQLiteOpenHelper の以下の2つのメソッド、

getWritableDatabase()
getReadableDatabase()

 返します。
 返されたオブジェクトを使って、データベースとやりとりします。