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というカラムを持たせなくて済みます。なんか腑に落ちませんがこれでいきます。。