需要CursorAdapter的_id行的解决方法

Emi*_*ily 14 android

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

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

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

bma*_*pin 13

不需要使用原始查询,CursorWrapper等.您可以完全按照上面提到的那样做:当您为查询指定列时,只需将"TableID as _id"指定为其中之一.实际上,我会使用BaseColumns._ID而不是_id.像这样的东西应该工作得很好:

static final String[] columns = new String[] {
    "TableID AS " + BaseColumns._ID,
    ...
};
Run Code Online (Sandbox Code Playgroud)

然后将其传递给您用于创建光标的任何内容(SQLiteDatabase,CursorLoader等)

我还建议将列名放入您可以在整个应用程序中引用的字符串常量,例如MyDatabase.TABLE_ID,以上情况就是如此MyDatabase.TABLE_ID + " AS " + BaseColumns._ID


Squ*_*onk 10

您的数据库不需要有一个名为'_id'的列,但CursorAdaptor确实需要返回一个.您可以在rawQuery中使用别名(例如"TableID as _id"构思)来执行此操作.

一个例子是我有一个带有列的表...

uid,name,number
Run Code Online (Sandbox Code Playgroud)

要查询SimpleCursorAdapter(例如),我使用数据库执行此操作rawQuery...

db.rawQuery("SELECT uid as _id,name,number FROM MY_TABLE");
Run Code Online (Sandbox Code Playgroud)

这很好,并为SimpleCursorAdapter提供必要的'_id'列.


Ken*_*ins 2

两种替代解决方案是使用 aCursorWrapper或使用ProjectionMapaManagedQuery将您的 uid 映射到_id。