男子大学生の考えること

日々思ったこと。プログラミング、音楽、アニメなど、、、

android cursoradapterで_id がないと怒られる

androidのSqliteDatabaseとSimpleCursorAdapterなんかを使っていると

つまずく原因頻出の

java.lang.IllegalArgumentException: column '_id' does not exist

_idっていうカラムがないぞ!!

とおこられる。

ググると確かに必要らしい。そうか、それだったら作ってあげるよと元のDBに_idを追加した。

 Cursor cursor = database.query("tableName", null, null, null, null, null, null);

これは

select * from tableName;

ということですね。

このあと

adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, cursor, 
new String[]{"columnName"}, new int[]{android.R.id.text1},0);

みたいな感じで使いますが、また_idがないと怒られます。
エミュレータのファイルには確かにあるはずなんだけどなー

なぜかはわかりませんがCursorの引数で_idを含んでいることが必要みたい。

(DBに_idを含んでいても)

そのあといろいろ試しましたが次で成功しました。

Cursor cursor = database.query("tableName", new String[]{"rowid as _id", "columnName"}, null, null, null, null, null);

select * としたいとき、SQLiteDatabase.queryの第二引数をnullにすればいいのですが、CursorAdapterで使うときはカラム名を指定する。さらに、SQLiteDatabaseはユーザが作っていなくてもデフォルトでrowidというオートナンバー型のカラムを常に持っています。なので、それを_idとしてしまおうということです。このようにすることで、わざわざDBに_idというカラムを持たせなくて済みます。なんか腑に落ちませんがこれでいきます。。