Ответ 1
Два альтернативных решения - либо использовать CursorWrapper
, либо использовать ProjectionMap
для ManagedQuery
для сопоставления вашего uid to_id.
Я узнал, что для работы класса CursorAdapter для Android мне нужна строка _id. Теперь у меня есть конкретная схема именования, и я не хочу менять свой столбец id (ID) на _id для всех таблиц, для которых мне нужны CursorAdapters. Я думаю, что это повлияет на читаемость некоторых моих сложных запросов - плюс "_id" - уродливый: P.
Я обсуждаю использование пользовательских запросов "TableID as _id", но мне нравятся методы запросов SQLiteDatabase, и они не похожи на то, что они поддерживают переименование столбцов в запросе.
Кажется довольно негибким (и нечетным) всегда требуется определенное имя столбца таблицы. Есть ли способ указать, какой столбец использовать в качестве столбца id для CursorAdapter? Или, может быть, другое обходное решение, о котором я не думал?
Два альтернативных решения - либо использовать CursorWrapper
, либо использовать ProjectionMap
для ManagedQuery
для сопоставления вашего uid to_id.
Нет необходимости использовать необработанный запрос, 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
В вашей базе данных нет столбца с именем "_id", но CursorAdaptor должен иметь один возвращаемый. Вы можете сделать это с помощью псевдонима (например, вашей идеи "TableID as _id" ) в rawQuery.
Примером является то, что у меня есть таблица со столбцами...
uid,name,number
Чтобы запросить это для SimpleCursorAdapter (например), я делаю это с помощью базы данных rawQuery
...
db.rawQuery("SELECT uid as _id,name,number FROM MY_TABLE");
Это прекрасно работает и поставляет необходимый столбец "_id" в SimpleCursorAdapter.
Я придумал это решение, с некоторой помощью из этого сообщения последовательных номеров строк из запроса. Он использует сгенерированное поле _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);