需要CursorAdapter的_id行的解决方法

时间:2011-04-29 00:38:52

标签: android

我发现为了让Android CursorAdapter类工作,我需要一行_id。现在,我有一个特定的命名方案,并且不希望将我的id列(称为ID)更改为_id,因为我需要CursorAdapters的所有表。我认为这会影响我的一些复杂查询的可读性 - 加上“_id”很难看:P。

我正在讨论使用自定义“TableID as _id”选择查询,但我喜欢SQLiteDatabase的好查询方法,看起来它们不支持在查询中重命名列。

总是需要特定的表列名称似乎相当不灵活(而且很奇怪)。有没有办法指定要用作CursorAdapter的id列的列?或者也许是我没有想过的另一种解决方法?

4 个答案:

答案 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);