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