私は長い間、つまり
SimpleCursorAdapter
正しい値を返している間に失敗するため。SO自体にも同様の多くの投稿があり、カーソルデータベースクエリに_id列を追加する必要があると言っています。
db.rawQuery(String,String)
onCreate(..)の私のコードは
HospitalData = new Database(this);
HospitalData.open();
Cursor c = HospitalData.getAllRows_Patient_Db();
startManagingCursor(c);
c.moveToFirst();
//HERE SOME LOOP IS NEEDED FOR TRAVERSING AND PUTTING IN THE LISTVIEW
while(c.isAfterLast() == false)
{
String[] columns = new String[] { c.getString(1), c.getString(2) };
int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
}
setListAdapter(adapter);
以前、私のデータベースアクセスコードは次のとおりでした
public Cursor getAllRows_Patient_Db()
{
return db.query(DATABASE_PATIENT_TABLE, new String[] {KEY_ROWID, KEY_ROOM_NUMBER,
KEY_PATIENT_INITIAL
},
null,
null,
null,
null,
null);
}
ここで、KEY_ROWIDは次のように定義されます
public static final String KEY_ROWID = "_id";
そしてこれのエラーは
07-04 22:10:23.301: ERROR/AndroidRuntime(16795): Caused by: java.lang.IllegalArgumentException: column '90' does not exist
07-04 22:10:23.301: ERROR/AndroidRuntime(16795): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
07-04 22:10:23.301: ERROR/AndroidRuntime(16795): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
ここで、列90は列IDではありませんが、私のデータベースによれば、cursor.getString(1)に格納されているデータですが、ここでは行IDであるcursor.getString(0)を検索しようとしていると思います。
後で次のようにコードを変更しました
public Cursor getAllRows_Patient_Db()
{
String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";
return db.rawQuery(db_sel,null);
}
しかし、それでもエラーが発生しているので、今回のエラーは異なります
07-04 21:36:12.510: ERROR/global(9861): Deprecated Thread methods are not supported.
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): FATAL EXCEPTION: main
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pro/com.pro.CopyOfFirstScreen}: android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: , while compiling: SELECT id as _id, KEY_ROOM_NUMBER,KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE
07-04 21:36:12.950: ERROR/AndroidRuntime(9861): Caused by: android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE: , while compiling: SELECT id as _id, KEY_ROOM_NUMBER,KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE
久しぶりに立ち往生しておりますので、よろしくお願いします!!
編集:さて、皆さんは私のクエリステートメントが正しいのを助けてくれてありがとう、申し訳ありませんが、データベースクエリの構文を理解するのが苦手ですが、私は学ぼうとしています
変更後の作業クエリは
String db_sel = "SELECT _id as _id, room_number" +",patient_initial FROM " + DATABASE_PATIENT_TABLE;
実際、宣言された文字列をキー値で変更する必要がありました
public static final String KEY_ROWID = "_id";
public static final String KEY_ROOM_NUMBER = "room_number";
public static final String KEY_PATIENT_INITIAL = "patient_initial";
しかし、クエリステートメントではなく、simplecursorAdapterにアクセスまたは使用する方法に起因する別の問題が発生しました。
テーブルに2行3列があることがわかるように、次に、列2と列3からデータをフェッチして、リストビューに配置します。しかし、クエリからの修正後、別のエラーが発生します
もともとは
String[] columns = new String[] {c.getString(1), c.getString(2) };
int[] to = new int[] { R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
setListAdapter(adapter);
そしてエラーは
07-05 21:32:29.228: ERROR/AndroidRuntime(1505): Caused by: java.lang.IllegalArgumentException: column '90' does not exist
07-05 21:32:29.228: ERROR/AndroidRuntime(1505): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
07-05 21:32:29.228: ERROR/AndroidRuntime(1505): at android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
android.widget.SimpleCursorAdapter.findColumns(SimpleCursorAdapter.java:312)
ご覧のとおり、行にアクセスしているにもかかわらず、最初の列のデータにアクセスしようとしています。
その後、コードに変更を加えました
int x = 0;
String[] columns = new String[] { c.getString(0),c.getString(1), c.getString(2) };
int[] to = new int[] { x, R.id.room_number_db, R.id.pt_initial_db };
adapter = new SimpleCursorAdapter(this,R.layout.patient_db, c,columns,to);
c.moveToNext();
setListAdapter(adapter);
これは、SimpleCursorAdapterが通常のカーソルとどのように異なる動作をするかを調べるための推測にすぎず、私が得るエラーは次のとおりです。
07-05 21:34:47.947: ERROR/AndroidRuntime(1966): Caused by: java.lang.IllegalArgumentException: column '1' does not exist
07-05 21:34:47.947: ERROR/AndroidRuntime(1966): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
私はこの質問が長くなりすぎていることを知っています:-(ここからいくつかのコードを削除することを提案しますか?