Подтвердить что ты не робот

Обходной путь для необходимости использования строки _id для CursorAdapter

Я узнал, что для работы класса CursorAdapter для Android мне нужна строка _id. Теперь у меня есть конкретная схема именования, и я не хочу менять свой столбец id (ID) на _id для всех таблиц, для которых мне нужны CursorAdapters. Я думаю, что это повлияет на читаемость некоторых моих сложных запросов - плюс "_id" - уродливый: P.

Я обсуждаю использование пользовательских запросов "TableID as _id", но мне нравятся методы запросов SQLiteDatabase, и они не похожи на то, что они поддерживают переименование столбцов в запросе.

Кажется довольно негибким (и нечетным) всегда требуется определенное имя столбца таблицы. Есть ли способ указать, какой столбец использовать в качестве столбца id для CursorAdapter? Или, может быть, другое обходное решение, о котором я не думал?

4b9b3361

Ответ 1

Два альтернативных решения - либо использовать CursorWrapper, либо использовать ProjectionMap для ManagedQuery для сопоставления вашего uid to_id.

Ответ 2

Нет необходимости использовать необработанный запрос, CursorWrapper и т.д. Вы можете сделать именно то, о чем вы упоминали: когда вы укажете столбцы для своего запроса, просто укажите "TableID as _id" как один из них. На самом деле вместо _id я бы использовал BaseColumns._ID. Что-то вроде этого должно работать нормально:

static final String[] columns = new String[] {
    "TableID AS " + BaseColumns._ID,
    ...
};

И затем передайте это тому, что вы используете, чтобы создать свой курсор (SQLiteDatabase, CursorLoader и т.д.).

Я также рекомендовал бы помещать ваши имена столбцов в String константы, которые вы можете ссылаться во всем приложении, например. MyDatabase.TABLE_ID, так что выше было бы MyDatabase.TABLE_ID + " AS " + BaseColumns._ID

Ответ 3

В вашей базе данных нет столбца с именем "_id", но CursorAdaptor должен иметь один возвращаемый. Вы можете сделать это с помощью псевдонима (например, вашей идеи "TableID as _id" ) в rawQuery.

Примером является то, что у меня есть таблица со столбцами...

uid,name,number

Чтобы запросить это для SimpleCursorAdapter (например), я делаю это с помощью базы данных rawQuery...

db.rawQuery("SELECT uid as _id,name,number FROM MY_TABLE");

Это прекрасно работает и поставляет необходимый столбец "_id" в SimpleCursorAdapter.

Ответ 4

Я придумал это решение, с некоторой помощью из этого сообщения последовательных номеров строк из запроса. Он использует сгенерированное поле _id. Преимущество здесь заключается в том, что вам не нужно возиться со своей схемой, и вы получаете хорошие последовательные значения _id.

Мой код для загрузки курсора был следующим:

Cursor c = db.rawQuery(
                 "SELECT * "
                +"FROM Sale "
                +"ORDER BY orderTime "
                , null);

Я добавил внутренний выбор, для которого требуется псевдоним имени внешней таблицы. (Обратите внимание, что 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);