ORMLite с CursorAdapter в Android
Я изменяю свое приложение для Android для работы с ORMLite, и в настоящее время он использует несколько CursorAdapters, которые я очень хочу сохранить в попытке свести к минимуму кодирование.
Я не уверен на 100%, но t показывает, что когда ORMLite создает поле id в db, он всегда использует id
, тогда как CursorAdapter нуждается в _id
.
Можно обойти это, используя следующий запрос:
select id as _id ......
но метод Dao.queryRaw()
возвращает список, а не курсор, поэтому я сделал это, чтобы открыть другое соединение базы данных SQLiteOpenHelper и использовать rawQuery()
.
Это работает, но есть ли лучшие способы сделать это вообще? Кажется, слишком сложно иметь два отдельных соединения с базой данных и, возможно, позже сохранить проблемы.
Ответы
Ответ 1
Ваши комментарии показывают, что вы уже ответили на вашу проблему. Вы можете создать столбец с именем "_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:
Android-курсор с ORMLite для использования в CursorAdapter
Вы можете получить доступ к 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();
}
Ответ 2
Оказывается, мне действительно нужен необработанный SQL-запрос с ORMLite, поскольку мне нужно было сделать Left Join (т.е. не в результате переименования столбца id в запросе, который не нужен в соответствии с Gray ответ выше)
Как я это сделал:
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);
}
}
Спасибо за совет