2012-09-14 8 views
12

Sto modificando la mia app per Android per funzionare con ORMLite e attualmente utilizza un numero di CursorAdapters, che voglio mantenere nel tentativo di minimizzare la codifica.ORMLite con CursorAdapter in Android

Io non sono sicuro al 100%, ma t sembra che quando ORMLite crea un campo id nel db, utilizza sempre id, mentre CursorAdapter bisogno _id.

E 'possibile ovviare a questo utilizzando una query come la seguente:

select id as _id ...... 

ma il metodo Dao.queryRaw() restituisce una lista, non un cursore, in modo che il modo in cui l'ho fatto è quello di aprire un altro database SQLiteOpenHelper connessione e utilizzare rawQuery().

Questo funziona, ma ci sono modi migliori per farlo? Sembra eccessivo disporre di due connessioni database separate e, forse, di accumulare problemi in seguito.

+0

Siamo spiacenti, sembra che questa domanda sia spuria. Mi sbagliavo, è possibile denominare colonne _id con ORMLite, quindi ho proposto di eliminare questa domanda per evitare confusione a meno che qualcuno non aggiunga altro a breve .. –

+2

Invece di eliminarlo, ti suggerirei di rispondere con come risolto - qualcuno potrebbe trovare utile questo, in particolare esempi di codice per come hai creato il cursore per lavorare con ORM – pjco

+1

hanno fatto sotto. Hai ragione - inutile cancellare, mi preoccupo solo che la gente inciampi in questo tipo di disinformazione e che metta via le persone, ma la risposta è leggere attentamente! –

risposta

12

I tuoi commenti indicano che hai già risposto al tuo problema. È certamente possibile creare una colonna denominata "_id" utilizzando ORMLite:

@DatabaseField(generatedId = true) 
private int _id; 

o

@DatabaseField(generatedId = true, columnName = "_id") 
private int id; 

Se si lavora con Cursor s quindi si consiglia di dare un'occhiata ai last() e moveAbsolute(...) metodi su la classe DatabaseResults. Inoltre, lo AndroidDatabaseResults (che è possibile eseguire il cast in) ha anche un metodoche restituisce l'oggetto sottostante Cursor e ha ulteriori metodi getCount() e getPosition().

Ecco alcuni ulteriori informazioni su ORMLite e Cursor s:

Android Cursor with ORMLite to use in CursorAdapter

È possibile ottenere l'accesso al Cursor utilizzando qualcosa di simile al seguente:

// 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

Ho appena capito che l'iteratore non deve essere chiuso mentre il cursore è in uso (ho indovinato). Come lo gestisci? Tenerlo in giro e chiuderlo in 'onDestroy()'? – Sebastian

+2

Se si tratta di una collezione raccolta con interesse, non è necessario che sia chiusa. Se si tratta di una raccolta lenta, una connessione verrà mantenuta aperta al database e sarà necessario chiuderla. Non sei sicuro di come farlo se sei all'interno di un CursorAdapter @Sebastian Android. – Gray

+0

Ci scusiamo per una domanda per principianti: la raccolta è pigro per impostazione predefinita? Ho avuto lo stesso problema di @Sebastian, chiudendo l'iteratore quando il cursore è in uso ha causato un arresto anomalo. In questo momento sto passando il cursore da una classe Datamanager a un frammento di lista e un cursore personalizzato. Funziona ma non sono sicuro di dove e quando rilasciare l'iteratore. – jannej

6

Si scopre ho avuto bisogno di una query SQL raw con ORMLite dopotutto, visto che avevo bisogno di fare un Left Join, (es. n ot come conseguenza di dover rinominare la colonna id in una query, che non è necessario in quanto per ogni risposta di Grey sopra)

Il modo in cui l'ho fatto è qui sotto:

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); 
    } 
} 

Grazie per la consulenza

+0

FYI: Abbiamo aggiunto alla versione 4.22 le funzionalità LEFT JOIN a ORMLite. È stato appena rilasciato. – Gray

Problemi correlati