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 и Cursors:

Курсор 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();
}

Оказывается, мне все-таки нужен был необработанный 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);
                }
            };
Другие вопросы по тегам