我想使用SimpleCursorAdapter来填充我的ListActivity,但是我得到了经典异常,因为我的Cursor中没有'_id'字段。不幸的是,这种类型的查询没有为我提供一个字段,我可以将其用作我的_id字段格式:
SELECT DISTINCT room from tblRates WHERE resid='ABC' AND date='2011-10-17'
由于DISTINCT我不能只添加_id。那么我该怎么做才能设置自定义适配器?
是的,我已经看过这篇文章,所以我明白为什么我会收到这个错误。只是想知道如何使用我正在进行的查询类型获取_id:答案 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
)。对于RuntimeException
和getInt()
实施(不确定哪个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);