Android ListView数据库exception

我是一个顽皮的男孩,我从Android开发者网站的官方记事本应用程序复制了一个方法,这是我的class级:

package com.example.prva; import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; public class ListView extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.listview); fillData(); } private void fillData() { // Get all of the notes from the database and create the item list Cursor c = DatabaseManager.getAllData(); startManagingCursor(c); String[] from = new String[] { DatabaseManager.TABLE_COLUMN_ONE }; int[] to = new int[] { R.id.text1 }; // Now create an array adapter and set it to display using our row SimpleCursorAdapter notes = new SimpleCursorAdapter(this, R.layout.notes_row, c, from, to); setListAdapter(notes); } } 

当我尝试运行此ListActivity时,出现此错误:

 01-31 02:39:14.259: E/AndroidRuntime(1845): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.prva/com.example.prva.ListView}: java.lang.IllegalArgumentException: column '_id' does not exist 

现在我明白了,因为它是真的,我的数据库中没有_id列(记事本应用程序数据库有它并使用它但我有自己的数据库),我只是不明白我的ListActivity中提到的那个列在哪里类? 从哪里调用它会给出错误?

请参阅CursorAdapter的文档:

Cursor必须包含名为_id的列,否则此类将不起作用。

在您的代码中,您使用SimpleCursorAdapter,它是一个派生类,因此该语句似乎适用。

游标就像迭代器或指针一样,它们只包含一个用于遍历数据的机制,它们本身不包含任何列。

从另一个文档中 ,您可以更好地理解上面的陈述:

处理内容URI ID

按照惯例,提供程序通过接受URI末尾的行ID值的内容URI来提供对表中单行的访问。 此外,按照惯例,提供程序将ID值与表的_ID列匹配,并对匹配的行执行请求的访问。

此约定有助于访问提供者的应用程序的通用设计模式。 该应用程序对提供程序执行查询,并使用CursorAdapter在ListView中显示生成的Cursor。 CursorAdapter的定义要求Cursor中的一列为_ID。

有几种方法可以解决问题:

  1. 在表格中添加“_id”列。

  2. 使用别名来获取curosr。 例如:

    选择someid为_id,name,number FROM TABLE1;