はまった...

AndroidでSDカード上のSQLiteデータベースを読み込むアプリケーション(最終的には音楽プレイヤーなのだ!!!)、少し進んだ。

サンプルの修正では画面が気に入らないので一から作り直した。

テーブルもCore Dataのでは上手くいかないのがわかったので一から作り直した。データはINSERTにSELECTをサブクエリで食わせて移行。テストデータベースで。

とりあえず、書き込み権限与えているのにREADONLYにしかならないから、とりあえずREADONLYで開発開始。書き込み(更新)は音楽の再生ができるようになるまで必要ないから問題ない。

開こうとしたらエラー。ステップ実行すると、バージョンダウンになっているとのこと。調べたら、データベースバージョンが指定されていなかった。Androidで作成するときは、「1」を指定して作り、インクリメントして、アップグレードしていく。

しかし、Androidで作っていない今回のデータベースにはバージョン情報が含まれていなかった。いろいろ調べたところ、プロンプトから、PRAGMAで付与できることがわかった。

>adb shell
$cd /sdcard/hogehoge
$sqlite hoge.db
#pragma user_version=1;
#.exit
$exit
>exit

で終了。(多分、記憶、ログとってない)

これで、Androidでデータベースバージョン1でアクセスするとバージョン一致でアクセスできた。

次にはまったのが、ListViewにSimpleCursorAdapterでSQLの結果(Cursorオブジェクト)を埋め込んで表示しようとしたとき。

何度見直しても例外が飛んで来る。

調べた。例外では、「_id」という未定義のカラムにアクセスしているという内容だったが、そんなカラムはテーブルにないし、使ってもいないから問題ないと思っていた。しかし、違っていた。SimpleCursorAdapterに渡すCursorを作るときのSQL文には、主キーを「_id」として取得して含めて置かなければいけなかったのだ。

そして、表示対象のカラムからは外して構わない。ということ。

だから、db.query()メソッドの引数のString[] columnsには「_id」が入っていなければいけない。

SimpleCursorAdapter()コンストラクタの引数のString[] fields では「_id」を使わなくても良い。

という事だった。レイアウトの美しさは別として、最初の画面から遷移して、SQLを実行、結果表示まではできた。さて、次はどの方向へ作業を進めるかだな。2冊持ってる参考書には書いてないことも多いし、手持ちの端末のOS2.1に合わせて開発しようとリファレンス見ると「Deprecated」になってるから推奨されてるのを使おうとするとOS2.1では実装されていなかったり(リファレンスだけは新しい)と、良くわからない状態。

Deprecatedはいいけど、どのバージョンでDeprecatedになってるのかを書いてないからリファレンスが役に立たない。Appleのサイトはきちんと書いている(iOSは知らないけど、Macの方は書いてある)。何とかして欲しい。

コメント