2012-01-01 7 views
2

Я хотел бы использовать SimpleCursorAdapter с Spinner.Получить курсор с сырым sql с ormlite

Я нашел, как вернуть курсор.

QueryBuilder<ChoixPointVerification, Integer> qb = choixPointVerificationDao.queryBuilder(); 
qb.where().eq(FIELD, id); 
PreparedQuery<ChoixPointVerification> preparedQuery = qb.prepare(); 
AndroidCompiledStatement compiledStatement = 
       (AndroidCompiledStatement)preparedQuery.compile(db, StatementType.SELECT); 

Cursor cursor = compiledStatement.getCursor(); 
return cursor; 

Но Spinner требует поля _id, и у меня будет только объект с полем id. Я предпочитаю избегать переименования поля.

Как я могу разрешить этот случай? Мне действительно нужно связать идентификатор ко всему полю Spinner.

Я представил себе, что я могу, возможно, выпустить курсор из rawsql, но я не нахожу, как с ormlite. Кажется, возможно, если я могу создать PreparedQuery с сырым sql.

Я также читал, что если у меня есть объект AndroidDatabase, я могу выпустить объект Cursor, но как мы можем создать AndroidDatabase с ormlite?

Я действительно открыт всем раствором

С уважением

ответ

4

Ну, я только что нашел решение, которое, кажется, чтобы быть эффективным, простым и совместимым с ormlite.

Мне просто нужно получить AndroidDatabase с getHelper().getReadableDatabase().

, а затем использовать

Cursor cursor = db.query("choixpointverification", 
    new String[] { "id", "id as _id", "nom" }, 
    "masque = 0 and idPointVerification = " + idPointVerification.toString(), 
    null, null, null, "tri"); 
8

Вы можете получить основной Cursor объект из ORMLite с помощью QueryBuilder без необходимости прибегать к исходному запросу. Взгляните на этот ответ:

Android Cursor with ORMLite to use in CursorAdapter

Вы можете сделать что-то вроде следующего кода:

// 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(); 
} 
+3

Когда я использую этот код для 'SimpleCursorAdapter' я получаю' StaleDataException 'из-за вызова' iterator.closeQuietly() '. На данный момент я просто прокомментировал эту строку, но я боюсь, что это создаст утечку памяти. – theblang