2011/05/03

SQLiteDatabaseをSDカードに構築する方法2

ちょっと気になったので色々と調べてみた。


まず、SQLiteOpenHelperのソースコードからgetWritableDatabaseを見てみると

やっていること自体はWeatherNowで実装している方法と一緒なのですが、データベース作成の部分が
・Context#openOrCreateDatabase
・SQLiteDatabase#openOrCreateDatabase
と違います。

Context#openOrCreateDatabaseでは第二因数に
・Context.MODE_PRIVATE(このアプリしか読み書きできない)
・Context.MODE_WORLD_READABLE(他のアプリから読めるけど書き込みは出来ない)
・Context.MODE_WORLD_WRITABLE(他のアプリから書き込みも出来る)
を指定。SQLiteOpenHelperでは0(Context.MODE_PRIVATE)が指定されています。


で、Context#openOrCreateDatabaseの影響範囲に付いてちろっと調べてみました。



結論だけ言うと、SQLoteOpenHelperを利用して
・API7(2.1)の端末ではSDカード上のDB読み書きできない
・API8(2.2)の端末ではSDカード上でもDB読み書きできる

でした。API8からはアプリのSDカード移動があるので、その関係で動作が変わったのかも?

ちなみに第二因数のファイルモードですが、アプリ専用領域(/data/data/******/)でしか機能しない様で、SD上の任意の場所にMODE_PRIVATEなデータベースは作成できないらしい。


まぁあれですよ
Android2.1のSDのDBアクセスに対応するには、SQLiteOpenHelperのmContext.openOrCreateDatabaseの部分をSQLiteDatabase.openOrCreateDatabaseに書き換えてしまえば問題ない。。。と思う。