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

ORMLite с CursorAdapter в Android

Я изменяю свое приложение для Android для работы с ORMLite, и в настоящее время он использует несколько CursorAdapters, которые я очень хочу сохранить в попытке свести к минимуму кодирование.

Я не уверен на 100%, но t показывает, что когда ORMLite создает поле id в db, он всегда использует id, тогда как CursorAdapter нуждается в _id.

Можно обойти это, используя следующий запрос:

select id as _id ......

но метод Dao.queryRaw() возвращает список, а не курсор, поэтому я сделал это, чтобы открыть другое соединение базы данных SQLiteOpenHelper и использовать rawQuery().

Это работает, но есть ли лучшие способы сделать это вообще? Кажется, слишком сложно иметь два отдельных соединения с базой данных и, возможно, позже сохранить проблемы.

4b9b3361

Ответ 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);
    }
}

Спасибо за совет