0

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

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 中提到的那个列在哪里班级?它是从哪里调用的,所以它给出了错误?

4

1 回答 1

1

请参阅CursorAdapter的文档:

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

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

游标就像迭代器或指针,它们只包含一种用于传输数据的机制,它们本身不包含列。

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

处理内容 URI ID

按照惯例,提供者通过接受内容 URI 来提供对表中单行的访问,该内容 URI 具有 URI 末尾的行的 ID 值。同样按照惯例,提供者将 ID 值与表的 _ID 列匹配,并对匹配的行执行请求的访问。

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

解决问题的几种方法:

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

  2. 使用别名获取光标。例如:

    SELECT someid as _id, name, number FROM TABLE1;

于 2013-01-31T02:56:22.133 回答