1

これが単純なカーソルアダプタの私のコードです。

public class CursorList extends ListActivity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    DatabaseAdapter da = new DatabaseAdapter(this, "mydb.sqlite");

    da.open();
    Cursor cur = da.fetchAllRecords("Doctors", new String[]{"FirstName"});
    startManagingCursor(cur);

    cur.moveToFirst();
    do {
        Log.v("Info", cur.getString(cur.getColumnIndex("FirstName")));
    } while(cur.moveToNext());

    cur.moveToFirst();

    String[] from = new String[]{"FirstName"};
    int[] to = new int[]{R.id.row};

    SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

    setListAdapter(sca);
    }
}

データレコードはログに正しく表示されますが、コードが

SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

ライン。

私が得るエラーは次のとおりです:

ERROR/AndroidRuntime(26746): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(26746): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.arnab.cursorlist/com.arnab.cursorlist.CursorList}:
java.lang.IllegalArgumentException: column '_id' does not exist

どこが間違っているのですか?

列'_id'が存在しないというエラーが表示されるのはなぜですか?テーブルに必要な列ですか?

編集:

カーソル関連のコードをtrycatchブロックに入れると、次のようになります。

try {
        SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

        setListAdapter(sca);
    }
    catch(Exception E) {
        Log.v("Error", E.getMessage());
    }

メッセージが表示されます:

VERBOSE/Error(1026): column '_id' does not exist

@Rasel:これがfetchAllRecords方法です

public Cursor fetchAllRecords(String table, String columns[]) {
    return mDb.query(table, columns, null, null, null, null, null);     
}
4

3 に答える 3

2

列「_id」が存在しないというエラーが発生するのはなぜですか? テーブルに必要な列は必要ですか?

はい、カーソル アダプタでデータベース情報を使用する場合。アダプターは、内部目的で使用します。テーブルには「_id」列が必要であり、クエリで選択する必要があります (したがって、Cursor結果セットに含まれます)。で実際に表示する必要はありませんListView

後世のために改訂

実際に '_id' 列を追加する代わりに、独自の 'id' 列を '_id' として追加することもできSELECTます。これはまったく同じように機能します。

于 2011-07-12T06:10:18.007 に答える
0

カーソル関連のコードを try catch ブロックに記述します。問題は解決されます。テーブルの作成時に、「_id」ではなく別の列を入力したことを確認してください。

于 2011-07-12T06:03:51.713 に答える
0

プロジェクションに table _id を含める必要があります。リスト カーソル アダプターは、行を追跡するために _id を必要とします。実際にどこにも表示したり使用したりする必要はありませんが、カーソルにはその列が含まれている必要があります。また、_id という名前の主キー列は、すべての Android テーブルで必須です。

于 2011-07-12T06:12:14.750 に答える