简单的光标适配器问题

Posted

技术标签:

【中文标题】简单的光标适配器问题【英文标题】:Simple Cursor Adapter problem 【发布时间】:2011-10-03 08:32:55 【问题描述】:

这是我的简单光标适配器的代码。

public class CursorList extends ListActivity 
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    DatabaseAdapter da = new DatabaseAdapter(this, "mydb.sqlite");

    da.open();
    Cursor cur = da.fetchAllRecords("Doctors", new String[]"FirstName");
    startManagingCursor(cur);

    cur.moveToFirst();
    do 
        Log.v("Info", cur.getString(cur.getColumnIndex("FirstName")));
     while(cur.moveToNext());

    cur.moveToFirst();

    String[] from = new String[]"FirstName";
    int[] to = new int[]R.id.row;

    SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

    setListAdapter(sca);
    

数据记录在日志中显示正确,但代码到达时停止工作

SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

行。

我得到的错误是:

ERROR/androidRuntime(26746): Uncaught handler: thread main exiting due to uncaught exception
ERROR/AndroidRuntime(26746): java.lang.RuntimeException: Unable to start activity ComponentInfocom.arnab.cursorlist/com.arnab.cursorlist.CursorList:
java.lang.IllegalArgumentException: column '_id' does not exist

我哪里出错了?

为什么会出现“_id”列不存在的错误?它是我们必须在表格中包含的必要列吗?

编辑:

当我将光标相关代码放在 try catch 块中时,如下所示:

try 
        SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.row_item, cur, from, to);

        setListAdapter(sca);
    
    catch(Exception E) 
        Log.v("Error", E.getMessage());
    

我收到消息:

VERBOSE/Error(1026): column '_id' does not exist

@Rasel : 这是fetchAllRecords 方法

public Cursor fetchAllRecords(String table, String columns[]) 
    return mDb.query(table, columns, null, null, null, null, null);     

【问题讨论】:

是的! _id 是您应该在表格中使用的列,而不是通常的 ids,例如 employee_idstudent_idproduct_id。您只需将这些 id 替换为 _id,因为 Android Sqlite 数据库是通过 _id 管理的。 【参考方案1】:

为什么会出现“_id”列不存在的错误?它是我们必须在表格中包含的必要列吗?

是的,如果您想在游标适配器中使用您的数据库信息。适配器将其用于内部目的。您的表必须有一个“_id”列,并且您必须在查询中选择它(所以它在Cursor 结果集中)。您不必在ListView 中实际显示它。

为后代修订

您可以SELECT您自己的“id”列作为“_id”,而不是实际添加“_id”列,它的工作原理是一样的。

【讨论】:

如果我有一个在其他应用程序中使用的现有数据库怎么办。我真的很犹豫要更改列名。有什么出路吗?我确实有一个“id”列。这会有帮助吗? 我从未见过有人提到绕过它的方法。您总是可以添加一个名为 _id 的新列并将其设为 INTEGER PRIMARY KEY AUTOINCREMENT,而不是更改列名。您实际上不必使用它,但适配器需要它以供参考。 你让我很好奇,所以为了扩展我的答案,这里 (netmite.com/android/mydroid/frameworks/base/core/java/android/…) 是 CursorAdapter 类的来源。有两个对“_id”列的引用,您可以更改它们而不会产生任何不利后果,然后扩展 CursorAdapter 以制作您自己的适配器。我不确定您必须复制多少其他类才能使其正常工作,但如果您认为值得研究,它可能是您的替代解决方案。祝你好运! :) 或者您可以尝试运行rawQuery() 来查询您的数据库并使用SELECT id as _id, column2, column3...,这将是一个更简单的解决方案。不过我不确定这会如何工作。 我尝试了原始查询。有效。甚至mDb.query(tablename, new String[]"student_id as _id", "FirstName", null, null, null, null, null); 工作!谢谢您的帮助。问题解决了!【参考方案2】:

在try catch块中编写Cursor相关代码。您的问题将得到解决。检查创建表时您键入了不同的列而不是'_id'

【讨论】:

为什么还有问题? 我把它放在一个 try catch 块中。生成的异常消息是:VERBOSE/Error(1026): column '_id' does not exist 查看您编写查询以检索值的代码。您正在尝试对列 _id 执行某些操作。但是在创建表时您没有给出名称 _id【参考方案3】:

您需要在投影中包含表 _id。列表游标适配器需要 _id 来跟踪行。您不必在任何地方实际显示或使用它,但光标需要包含该列。每个 android 表中还必须有一个名为 _id 的主键列。

【讨论】:

强制是什么意思?假设我没有使用 SimpleCursorAdapter,我还需要在我的表中包含“_id”列吗?

以上是关于简单的光标适配器问题的主要内容,如果未能解决你的问题,请参考以下文章

Android - 使用片段和简单的光标适配器填充列表视图

我应该关闭从适配器获得的光标吗?

带有光标适配器滚动问题的android列表视图

如何为列表视图创建自定义光标适配器以用于图像和文本?

运行时自定义光标适配器错误,非法参数异常

android光标未关闭错误