0

なぜ昨日このエラーが発生したのかという質問をいくつかのコードで解決しようとしていました:

java.lang.IllegalArgumentException: column '_id' does not exist

特に必要のないコードがたくさんあったので、どこが間違っているのかを理解しやすくするために、多くのコードを取り除きました。しかし、本質的にこれは私のスキーマです:

database.execSQL("CREATE TABLE events (" +
                "_id INTEGER PRIMARY KEY, event_name TEXT" +
                ")");

お分かりのように、見た目は問題ありません。私が読むのを忘れていない限り、それは明らかにそこにあります。しかし、その後、エラーの原因がどこにあるのかを突き止めました。または、少なくともこれが理由であると確信しています。カーソルを取得するこのコード:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT event_name FROM events", null);
}

Androidによると、これがエラーです。これに変更すると:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT * FROM events", null);
}

すべてが桃です。前者だとクラッシュします。これがなぜなのかについての理由は何でも。rawQuery() でそれができると思いました。where句を含めていない限り、そうではありません。どんな助けでも大歓迎です。

4

4 に答える 4

2

eventこれらをカーソルと呼びましょう:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT event_name FROM events", null);
}

...および*カーソル:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT * FROM events", null);
}

あなたが受け取った答えのほとんど(ここにあるものでさえ:Androidでは、作成されたテーブルに_idが存在する必要がありますか?)は、エラーの考えられる原因を推測しています。私もあなたの質問に答えると思いました:

理由は何ですか(前者はクラッシュし、後者は桃色ですか?)

*eventカーソルの違いは、すべての列を暗黙的に*選択し、を選択するだけであるということです。テーブルでは、カーソルは次と同等です。eventevent_nameevents*

SELECT _id, event_name FROM events;

これが、このカーソルが桃色に機能する理由です。つまり、このエラーは発生していません。

java.lang.IllegalArgumentException: column '_id' does not exist

_idで列を暗黙的に選択しているためです*

もちろん、このエラーが発生する最も可能性の高い理由は、データをListView、Spinnerなどでバインドする場合です。それらはすべて、何らかの形式のCursorAdapterを使用する傾向があります。これはCursorAdapterのドキュメントからのものです:

カーソルからListViewウィジェットにデータを公開するアダプター。カーソルには「_id」という名前の列が含まれている必要があります。含まれていない場合、このクラスは機能しません。

したがって、解決策は単純です。クエリ内の列と、必要な他の列を選択する必要があります。_id(コンパイラはあなたに嘘をついていません。)

そうは言っても、これがまだアプリに有効でないと思われる場合、または意味がない場合は、カーソルを使用するコードを投稿してください。エラーがスローされます。

于 2012-06-03T16:40:31.730 に答える
1

カーソルを処理していたものが _ID 列を取得しようとしていたと思われますが、選択ステートメントで指定されていませんでした。のようなことをして、

public Cursor getEventsName() {
    return database.rawQuery( "SELECT _id, event_name FROM events", null);
}

SimpleCursorAdapter一部の Android コンポーネント ( requireなど) が呼び出された_IDときに内部で使用されるため、select ステートメントで使用できる必要があります。getItemId()

于 2012-06-03T13:46:32.937 に答える
1

java.lang.IllegalArgumentException: 列 '_id' が存在しません

私は同じ問題を抱えていました。この例外は、名前付きの列SimpleCursorAdapterが必要なためスローされます。たとえば、列を PK としてテーブルを作成した場合に解決できるため、次のように試すことができます。SELECT_idKEY_ID

SELECT KEY_ID AS _id, column1, column2 FROM SomeTable.
于 2012-06-03T13:56:59.693 に答える
0
public Cursor getEventsName() {
return database.rawQuery( "SELECT * FROM events", null);

に変更します

    public Cursor getEventsName(){

    final String[] columns = new String[]{"_id", "event_name "};
    return database.query(events, columns, ""   , null, null, null, null);
}
于 2012-06-03T14:41:25.477 に答える