Android SQLiteOpenHelper getWritableDatabase getReadableDatabase との関係

AndroidSQLiteのラッパー、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叩いていけばできると思うけどめんどくさい。