我发现为了让Android CursorAdapter类工作,我需要一行_id。现在,我有一个特定的命名方案,并且不希望将我的id列(称为ID)更改为_id,因为我需要CursorAdapters的所有表。我认为这会影响我的一些复杂查询的可读性 - 加上“_id”很难看:P。
我正在讨论使用自定义“TableID as _id”选择查询,但我喜欢SQLiteDatabase的好查询方法,看起来它们不支持在查询中重命名列。
总是需要特定的表列名称似乎相当不灵活(而且很奇怪)。有没有办法指定要用作CursorAdapter的id列的列?或者也许是我没有想过的另一种解决方法?
答案 0 :(得分:13)
不需要使用原始查询,CursorWrapper等。您可以完全按照上面提到的那样做:当您为查询指定列时,只需将“TableID as _id”指定为其中之一。实际上,我会使用BaseColumns._ID而不是_id。像这样的东西应该工作得很好:
static final String[] columns = new String[] {
"TableID AS " + BaseColumns._ID,
...
};
然后将其传递给您用于创建光标的任何内容(SQLiteDatabase,CursorLoader等)
我还建议您将列名放入可在整个应用中引用的字符串常量,例如: MyDatabase.TABLE_ID
,因此以上内容为MyDatabase.TABLE_ID + " AS " + BaseColumns._ID
答案 1 :(得分:10)
您的数据库不需要有一个名为'_id'的列,但CursorAdaptor确实需要返回一个。您可以在rawQuery中使用别名(例如“TableID as _id”构思)来执行此操作。
一个例子是我有一个带有列的表......
uid,name,number
要查询SimpleCursorAdapter(例如),我使用数据库rawQuery
执行此操作...
db.rawQuery("SELECT uid as _id,name,number FROM MY_TABLE");
这很好用,并为SimpleCursorAdapter提供必要的'_id'列。
答案 2 :(得分:2)
两种替代解决方案是使用CursorWrapper
,或使用ProjectionMap
的{{1}}来映射您的uid to_id。
答案 3 :(得分:0)
我在这篇文章sequential row numbers from query的帮助下提出了这个解决方案。它使用生成的_id字段。这里的优点是你不需要弄乱你的模式,你得到了很好的顺序_id值。
加载Cursor的代码如下:
Cursor c = db.rawQuery(
"SELECT * "
+"FROM Sale "
+"ORDER BY orderTime "
, null);
我添加了内部select,它需要外部表名的别名。 (注意 t2 如何在内部选择中使用,但是在外部选择中创建)
Cursor c = db.rawQuery(
"SELECT "
+"(select COUNT(0) from Sale t1 where t1.orderTime <= t2.orderTime) as _id,t2.* "
+"FROM Sale t2 "
+"ORDER BY t2.orderTime "
, null);