0

(_idフィールドを持つ)テーブルを持つデータベースからカーソルを取得しようとしていますが、simplecursoradapterを作成できません。エラーが表示されます。

  SqlliteException: no such column: _id 

しかし、私のデータベースクラスの何が問題になっていますか?

//The columns we'll include in the dictionary table
public static final String COLUMN_ID = "_id";
public static final String COL_WORD = "WORD";
public static final String COL_DEFINITION = "DEFINITION";


private static final String FTS_TABLE_CREATE =
                "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE +
                " USING fts3 (" + COLUMN_ID + " integer primary key autoincrement, " +
                COL_WORD + ", " +
                COL_DEFINITION + ")";

そしてカーソルを戻します

public Cursor getWordMatches(String query, String[] columns) {
    String selection = COL_WORD + " MATCH ?";
    String[] selectionArgs = new String[] {query+"*"};

    return query(selection, selectionArgs, columns);
}

private Cursor query(String selection, String[] selectionArgs, String[] columns) {
    SQLiteQueryBuilder builder = new SQLiteQueryBuilder();
    builder.setTables(FTS_VIRTUAL_TABLE);

    String[] col = new String[] {COLUMN_ID, COL_WORD};
    //ubacio null - col
    Cursor cursor = builder.query(mDatabaseOpenHelper.getReadableDatabase(),
            col, selection, selectionArgs, null, null, null);

    if (cursor == null) {
        return null;
    } else if (!cursor.moveToFirst()) {
        cursor.close();
        return null;
    }
    return cursor;
}

これはListViewを表示する私のアクティビティです

          //query the db class method getWordMatches()
      Cursor c = db.getWordMatches(query, null);
          displayWords(c);

      }
    }


public void displayWords(Cursor c){

    // Creates a new SimpleCursorAdapter
    SimpleCursorAdapter mCursorAdapter = new SimpleCursorAdapter(
        getApplicationContext(),                    // The application's Context object
        android.R.layout.simple_list_item_1,        // A layout in XML for one row in the ListView
        c,                                          // The result from the query
        new String[] {DatabaseTable.COL_WORD},      // A string array of column names in the cursor
        new int[] { android.R.id.text1 });          // An integer array of view IDs in the row layout


    // Sets the adapter for the ListView
    setListAdapter(mCursorAdapter);

}

チュートリアルはhttp://developer.android.com/training/search/search.htmlからのものです

4

2 に答える 2

3

rowidFTSをAndroidに変更するには、エイリアスを使用する必要があります_id

String[] col = new String[] {"rowid as " + COLUMN_ID, COL_WORD};

FTSでは、 「シンタックスシュガー」"integer primary key autoincrement"として完全に無視されるため、主キーのデフォルトの列名を上書きすることはできません。実際、FTSは単に列を一般的な列として解釈します..._id

したがって_id、create-tableステートメントから削除する必要があります。そうしないと、余分な_id列が追加されます。

private static final String FTS_TABLE_CREATE =
            "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE +
            " USING fts3 (" + COL_WORD + ", " + COL_DEFINITION + ")";
于 2013-02-22T21:49:01.123 に答える
0

CursorAdpaterクラスの要件として、基になるCursorオブジェクトには「_id」という名前の列が含まれている必要があります。そのため、このエラーが発生します。これは、CursorAdapter Docから直接引用したものです:http://developer.android.com/reference/android/widget/CursorAdapter.html

于 2013-02-22T22:27:24.150 に答える