2012年11月4日日曜日

CursorAdapter

AndroidによくあるListViewには、様々なデータ集合を貼り付けることができます。Adapterと呼ばれるクラスが、この集合を管理します。

Adapter自体は抽象クラスで、ArrayAdapterやら、BaseAdapterやらを実際には使うことになります。そういった、Adapterの一つが、CursorAdapterです。

Cursorは、データベースにアクセスするための構造で、query()が返すiteratorのようなものです。要するに、Queryを書いて、その結果をCursorAdapterに与えることで、DBから得られる検索結果を一覧することができるというわけです。

このとき、データベースのQueryは、'_id'という、整数型のユニークな値を持ったカラムを持っていなければなりません。

が、Androidに搭載されているDBは、SQLite3。AUTOINCREMENTなデータカラムを作るには、それをPRIMARY KEYにしなければならず、他にキーを持たせたい時には使えません。

さて、どうしたものか、と思い悩んでいると、SQLite3は、頼んでもいないのに、勝手に、rowid というユニークな値を持ったカラムをこっそり作っていることが判明。

ならば、Queryに与える projection をちょいちょいといじってやれば、rowidを_idの代わりに仕立てることができるじゃないですか。以上で、余計なカラムを作らずに、_idを得ることができました。それにしても、SQLite3を使うんだから、_idじゃなくてrowidを使うように、CursorAdapterが実装されていればよかったのに……。

String[] projection = new String[] { "rowid as _id", "*" };
Cursor cursor = managedQuery(uri, projection, where, whereArgs, sort);

0 件のコメント:

コメントを投稿