ORMLite с помощью CursorAdapter в Android
Я модифицирую свое Android-приложение для работы с ORMLite, и в настоящее время оно использует несколько CursorAdapters, которые я очень хочу сохранить, чтобы минимизировать кодирование.
Я не уверен на 100%, но кажется, что когда ORMLite создает поле идентификатора в БД, оно всегда использует id
тогда как CursorAdapter нужен _id
,
Это можно обойти, используя запрос, подобный следующему:
select id as _id ......
но Dao.queryRaw()
Метод возвращает список, а не Курсор, поэтому я сделал так, чтобы открыть другое соединение с базой данных SQLiteOpenHelper и использовать rawQuery()
,
Это работает, но есть ли лучшие способы сделать это вообще? Кажется излишним иметь два отдельных подключения к базе данных и, возможно, накапливать проблемы позже.
2 ответа
Ваши комментарии показывают, что вы уже ответили на вашу проблему. Вы можете создать столбец с именем _id, используя ORMLite:
@DatabaseField(generatedId = true)
private int _id;
или же
@DatabaseField(generatedId = true, columnName = "_id")
private int id;
Если вы работаете с Cursor
Если вы захотите взглянуть на last()
а также moveAbsolute(...)
методы наDatabaseResults
учебный класс. Так жеAndroidDatabaseResults
(который вы можете бросить) также имеет getRawCursor()
метод, который возвращает базовый Cursor
объект и имеет дополнительные getCount()
а также getPosition()
методы.
Вот еще немного информации об ORMLite и Cursor
s:
Вы можете получить доступ к Cursor
используя что-то вроде следующего:
// build your query
QueryBuilder<Foo, String> qb = fooDao.queryBuilder();
qb.where()...;
// when you are done, prepare your query and build an iterator
CloseableIterator<Foo> iterator = dao.iterator(qb.prepare());
try {
// get the raw results which can be cast under Android
AndroidDatabaseResults results =
(AndroidDatabaseResults)iterator.getRawResults();
Cursor cursor = results.getRawCursor();
...
} finally {
iterator.closeQuietly();
}
Оказывается, мне все-таки нужен был необработанный SQL-запрос с ORMLite, поскольку мне нужно было выполнить левое соединение (т.е. не в результате необходимости переименовывать столбец id в запросе, что не является необходимым согласно ответу Грея выше)
Как я это сделал ниже:
public class DatabaseHelper extends OrmLiteSqliteOpenHelper{
public void myRawQueryMethod() {
SQLiteDatabase database = this.getReadableDatabase();
String SqlQuery = "Write raw SQL query here";
Cursor cursor = database.rawQuery(SqlQuery, null);
}
}
Спасибо за совет
Оберните ваш курсор другим курсором, который лечит "_id"
в качестве псевдонима вашего реального столбца первичного ключа. Пример:
cursor = new CursorWrapper(cursor) {
@Override
public int getColumnIndexOrThrow(String columnName) throws IllegalArgumentException {
if ("_id".equals(columnName)) columnName = "id";
return super.getColumnIndexOrThrow(columnName);
}
};