Android SQLiteOpenHelper getWritableDatabase getReadableDatabase との関係
Android のSQLiteのラッパー、SQLiteOpenHelper
関数 getWritableDatabase getReadableDatabase、
こんな設計おかしいやん?
という挙動を見せるのでAndroidOSのソース(java)を見にいったら案の定おかしい。
これはアンドロイドOSの歴史に俺の名を刻むチャンス!
と思ったのもつかの間、最新版android-4.3.1_r1.0/ のバージョンだと修正されていることが判明。ちぇっ。
ソースはここで調べましたありがたいサービス。
https://sites.google.com/site/devcollaboration/codesearch
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
android-4.3.1_r1.0 未満ではこんな感じでおかしいです。
SQLiteOpenHelper クラスから派生して MyDBOpenHelper というクラスを作ったとした場合、
DBが無いときに
SQLiteOpenHelper.getReadableDatabase()
を呼ぶと
MyDBOpenHelper.getWritableDatabase()が実行される。つまり派生クラスの関数が呼ばれちゃう。
こうされちゃうと、オーバーライドした
MyDBOpenHelper.getWritableDatabase() で、何かの条件とかで NULLを返したい場合があったとしても、
迂闊にNULLを返すと
MyDBOpenHelper.getReadableDatabase()のほうがしくじることがあるのでカスタマイズ難しい。
具体的には俺がうまくいかなかったのは
「リードオンリーのDBにしたいのにできない」
ということです。
どちらにせよandroid-4.3.1未満の端末に対応しなきゃいけないので
リードオンリーのDBはうまく作れない、ということですね。
もっとローレベルのAPI叩いていけばできると思うけどめんどくさい。