当前位置: 首页 > 知识库问答 >
问题:

无法从SimpleCursorAdapter中的DB加载游标,因为没有这样的列:\u id

田宇
2023-03-14

我试图从具有表(带有_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

共有2个答案

欧阳勇
2023-03-14

作为CursorAdpater类的一个要求,基础的光标对象必须包含一个名为“_id”的列,这就是为什么会出现这个错误。这是直接从CursorAdapter文档:http://developer.android.com/reference/android/widget/CursorAdapter.html

蔚弘量
2023-03-14

您需要使用别名将FTS'rowid更改为Android的\u id

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

FTS不允许您重写主键的默认列名,因为整数主键自动增量被完全忽略为语法糖。事实上,FTS只是将您的_id列解释为泛型列...

因此,您应该从create-table语句中删除_id,否则它会添加一个额外的_id列:

private static final String FTS_TABLE_CREATE =
            "CREATE VIRTUAL TABLE " + FTS_VIRTUAL_TABLE +
            " USING fts3 (" + COL_WORD + ", " + COL_DEFINITION + ")";
 类似资料:
  • 我正在尝试用铁轨在条纹中创建一个一次性的单次充电。我得到以下错误: 不过,从照片中可以清楚地看到,令牌在参数中。该令牌来自Stripe.js。 下面是我的控制器中的代码:

  • 我正在尝试运行一个jruby应用程序。每当我启动jruby脚本时,应用程序就会抛出一个错误 loaderror:没有这样的文件可加载--openssl/dummy(root)在/home/ubuntu/.rvm/gems/jruby-1.7.3/gems/jruby-0.8.2/lib/shared/jruby-openssl.rb:15 require at org/jruby/rubykern

  • 我正在尝试用Tesseract OCR阅读器阅读pdf。不过,它对图像文件非常有效。 以下是我所做的: > 创建一个Maven项目 添加了tess4j版本4.4.1作为依赖项 将java版本更改为13 添加了以下代码: 之后,我发现以下错误: 我该如何着手解决这个问题?

  • 我有一个简单的Spring云配置服务器,它使用git服务器的配置。 ConfigServer引导。yml: 当我在本地部署ConfigServer时,我可以从http://localhost:8888/myapp/test 。但当我在测试服务器上部署ConfigServer时,当我点击

  • 我有以下使用嵌套游标的代码。它们都不是空的,但我在内部游标上收到错误“android.database.CursorIndexOutOfBoundsException: Index 0请求,大小为0”。 getName()方法: 我无法理解我在哪里做错了。有没有不同的方法来处理sqlite db中的嵌套游标。请帮助。 谢谢

  • NoSuChelementException:消息:没有这样的元素:找不到元素:{“method”:“id”,“selector”:“id”} 求求你了。帮助我^^