閉じる

Cursor#getColumnIndex / Cursor#getColumnIndexOrThrowでの同名カラム問題

複数のテーブルを結合したクエリを発行すると結果に主キーが複数含まれる事はよくあると思う。
その状態で getColumnIndex/getColumnIndexOrThrowを呼ぶとどうなるか?
AbstractCursor.javaの実装はカラム名のリストを最初から見ていって最初に見つかった位置を返してくれる。
しかし、SQLiteCursor.javaの実装はカラム名->インデックスのマップ(HashMap<String, Integer>)を保持しておいてソレを参照すると言うことをやっている。
結果、同名のカラムが複数あると最後に登場した位置だけが保持されることになる。
結論としては Cursorの実装によって挙動が異なるので、自前で Cursor#getColumnNames()を調べるか、同名カラム自体が登場しない構造*1 にするしかないと思う。
ちなみにテーブル名つけても*2 ここで扱うカラム名リストからは取り除かれるので無意味。


*1 asを使って別名つけるなど

*2 まぁ 同名カラムが登場するクエリはつけないと通らないけど

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)