0

私は長い間、つまり

 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にアクセスまたは使用する方法に起因する別の問題が発生しました。

DBテーブル

テーブルに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)

私はこの質問が長くなりすぎていることを知っています:-(ここからいくつかのコードを削除することを提案しますか?

4

3 に答える 3

2

新しいエラーは、データベースにテーブル「DATABASE_PATIENT_TABLE」がないことを示しています。データベース内のテーブルの名前ではなく、データベース内のテーブルの名前を含む文字列の静的フィールド名であるように見えるコードから。

以下のコードでは、「DATABASE_PATIENT_TABLE」をデータベース内のテーブルの名前に変更する必要があります。

String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";

これを試して、機能するかどうかを確認してください。

String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
",KEY_PATIENT_INITIAL FROM" +  DATABASE_PATIENT_TABLE;

元のエラーに関しては、SimpleCursorAdapterに_idのフィールドが含まれている必要があります。カーソルを動かすSQLStatmentに加えた変更はそれを修正するはずですが、SQLステートメントに正しいテーブル名があることを確認する必要があります。

お役に立てれば。

于 2011-07-04T17:58:46.107 に答える
2

エラースタックのこの部分を読んだことがありますか?

android.database.sqlite.SQLiteException: no such table: DATABASE_PATIENT_TABLE:

?データベースにそのようなテーブルがないだけです。CursorAdapterの問題ではありません。あなたのループは完全に無意味に思えます-Javaハンドブックを読んでください。さて、あなたのコードのいくつかの問題をリストアップしましょう:

String[] columns = new String[] { c.getString(1), c.getString(2) };

columns[]値ではなく列名を含める必要があります...while{}ループでは、最後の1つだけが渡されている間に、数十(?)のSimpleCursorAdaptersを作成しています。コードのこの部分:

String db_sel = "SELECT id as _id, KEY_ROOM_NUMBER" +
    ",KEY_PATIENT_INITIAL FROM DATABASE_PATIENT_TABLE";

明らかに間違っています。私はあなたが次のようなものを持っていると思います

private static String DATABASE_PATIENT_TABLE = "patient";

したがって、これらの定数を使用してください。

String db_sel = "select id as _id, +"KEY_ROOM_NUMBER+", "+ KEY_PATIENT_INITIAL +" from "+DATABASE_PATIENT_TABLE;

それを置き換えます:

 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 };

それと:

 String[] columns = new String[] { c.getColumnName(1), c.getColumnName(2) };
    int[] to = new int[] {R.id.room_number_db, R.id.pt_initial_db };
于 2011-07-04T16:16:24.123 に答える
0

問題は修正されました。主なことは、データベースへのクエリごとに常に_idをクエリする必要があることですが、cursor.getString(someIndex)を使用してクエリを実行すると、私の場合のアダプターとして誤解を招く可能性があります。最初の列の内容をROWIDとして取得し、行を検索しようとしています。

rawQuery()を実行するか、「Select_idas_id」を使用することは必須です。私が感じたように、これらのことは時々誤解を招くことがあります。

したがって、以下のことを単純に保つことがコードです。データベースコード

 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);
}

アクティビティコード

    HospitalData = new Database(this);
    HospitalData.open();
    Cursor c = HospitalData.getAllRows_Patient_Db();


    startManagingCursor(c);

    String[] columns = new String[] {HospitalData.KEY_ROOM_NUMBER,HospitalData.KEY_PATIENT_INITIAL };
     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);
于 2011-07-05T20:47:52.677 に答える