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

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に書き換えてしまえば問題ない。。。と思う。

2011/03/13

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

WeatherNowでは次バージョンでアメダス・天気情報をデータベース化します。
実際に作って試してみたところアメダス情報79レコードで16KBとなり、将来的に内部ストレージに保存するにはちょっと厳しくなる。なのでSDカード上にデータベースを作ってみました。
*ここに載せているコードは実際のコードではなくブログ用に手打ちしています。ミスがあるかも知れませんが悪しからず。


先にこちらの記事から読んで下さいな。

まずは失敗コード。

このサイト様を参考に作ったのですが、これを実際に使ってみると
java.lang.IllegalArgumentException:
File /sdcard/weathernow/database/weathernow_database.db contains a path separator
と怒られてしまいました。ちなみにTargetAPIは7です(Android 2.1向け)。

SQLiteOpenHelperで管理するデータベースはどうやら"/"を含んではいけない様です。


以下、改善策。
SQLiteOpenHelperのソースを読んでも全く参考にならなかったのですが、グーグル先生で探したところこちらにSDカード上にデータベースを構築する方法がありました。


・DatabaseAccess.java(SQLiteOpenHelperの代わり)

こんな感じのを作りました。openDatabase()で一度データベースを開きさえすれば、後はSQLiteOpenHelperでの操作とほとんど変わらないと思います。


最後に、noxiはこの記事のエントリー時でやっとJava歴3ヶ月のペーペーであり、SQLiteに関してもほとんど知識はありません。この記事の内容通りに実装してエラーを起こしてデータベースにアクセスできなくなっても一切の保証は致しかねます。