列'_id'不存在SimpleCursorAdapter重新访问

时间:2011-10-17 15:57:32

标签: android sqlite listactivity simplecursoradapter

我想使用SimpleCursorAdapter来填充我的ListActivity,但是我得到了经典异常,因为我的Cursor中没有'_id'字段。不幸的是,这种类型的查询没有为我提供一个字段,我可以将其用作我的_id字段格式:

SELECT DISTINCT room from tblRates WHERE resid='ABC' AND date='2011-10-17'

由于DISTINCT我不能只添加_id。那么我该怎么做才能设置自定义适配器?

是的,我已经看过这篇文章,所以我明白为什么我会收到这个错误。只是想知道如何使用我正在进行的查询类型获取_id:

Android column '_id' does not exist?

3 个答案:

答案 0 :(得分:5)

你可以这样做......

SELECT DISTINCT room, 1 _id from tblRates WHERE resid='ABC' AND date='2011-10-17'

这将为每行添加一个值为1的_id列。另外我认为如果你想要列的不同值而不是1,sqlite就像每个表的隐藏“rowid”列一样。

答案 1 :(得分:3)

  

那么我该怎么做才能设置自定义适配器?

除了自定义Adapter方法,您还可以使用CursorWrapper添加自己的_id值。只需从1或其他内容开始依次编号,并且不要尝试将它们用作数据库中的实际键。 : - )


<强>更新

脱下袖口......

步骤1:创建CursorWrapper的子类。

第2步:停留在包裹getColumnCount()的{​​{1}}值,此处称为Cursor

第3步:覆盖N以返回getColumnCount()

第3步:覆盖N+1以返回getColumnIndex()作为N列索引。

步骤#4:覆盖以_id为参数的所有其他方法。如果索引不是int columnIndex,请将工作委托给包裹的N;否则,自己实施(如果不可能或不方便而且你不需要它,则抛出Cursor)。对于RuntimeExceptiongetInt()实施(不确定哪个getLong()使用),请返回一些可能的唯一值(例如,只需通过CursorAdapter使用您的位置)。

步骤5:创建子类的实例,将getPosition()Cursor子句包装在一起,然后将其传递给DISTINCT

答案 2 :(得分:1)

在SQLiteDatabase中使用方法“query”可能会有所帮助。

例如,

SQLiteDatabase db = openHelper.getReadableDatabase();
Cursor c = db.query(
             "tblRates", 
             new String[] { "_id", "room" }, 
             "resid=? AND date=?", 
             new String[] { "ABC", "2010-10-17" }, 
             "room", 
             null, 
             "room");
SimpleCursorAdapter a = new SimpleCursorAdapter(
                           getActivity(), 
                           android.R.layout.simple_dropdown_item_1line, 
                           c, 
                           new String[] { "room" }, 
                           new int[] { android.R.id.text1 }, 
                           0);