2012-09-14 42 views
12

Estoy modificando mi aplicación de Android para que funcione con ORMLite, y actualmente utiliza una cantidad de CursorAdapters, que deseo mantener en un intento de minimizar la codificación.ORMLite con CursorAdapter en Android

No estoy 100% seguro, pero t parece que cuando ORMLite crea un campo de Id. En el archivo db, siempre usa id, mientras que CursorAdapter necesita _id.

Es posible conseguir alrededor de esto mediante una consulta como la siguiente:

select id as _id ...... 

pero el método Dao.queryRaw() devuelve una lista, no un cursor, por lo que la forma en que he hecho es abrir otra base de datos SQLiteOpenHelper conexión y uso rawQuery().

Esto funciona, pero ¿hay alguna forma mejor de hacerlo? Parece excesivo tener dos conexiones de bases de datos separadas, y quizás almacenar problemas más tarde.

+0

Lo siento, parece que esta pregunta es falsa. Estaba equivocado, es posible nombrar las columnas _id con ORMLite, por lo que propuse eliminar esta pregunta para evitar confusiones a menos que alguien tenga algo más que agregar pronto. –

+2

En lugar de eliminarla, le sugiero que la responda con la forma en que Se arregló, es posible que alguien lo encuentre útil, especialmente los ejemplos de código para la forma en que creó el cursor para trabajar con ORM – pjco

+1

que se muestran a continuación. Tienes razón, no hay necesidad de eliminar, solo me preocupa que la gente tropiece con este tipo de desinformación y que deje a las personas sin rastro, ¡pero la respuesta es leer con cuidado! –

Respuesta

12

Sus comentarios indican que ya ha respondido su problema. Por supuesto que puede crear una columna denominada "_id" usando ORMLite:

@DatabaseField(generatedId = true) 
private int _id; 

o

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

Si está trabajando con Cursor s entonces es posible que desee echar un vistazo a los métodos last() y moveAbsolute(...) en la clase DatabaseResults. Además, el AndroidDatabaseResults (al que puede convertir) también tiene un método getRawCursor() que devuelve el objeto subyacente Cursor y tiene métodos adicionales getCount() y getPosition().

Éstos son algunos más información sobre ORMLite y Cursor s:

Android Cursor with ORMLite to use in CursorAdapter

Usted puede obtener acceso a la Cursor usar algo como lo siguiente:

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

Acabo de descubrir que el iterador no debe estar cerrado mientras el cursor está en uso (lo supuse). ¿Cómo manejas eso? Guárdelo y ciérrelo en 'onDestroy()'? – Sebastian

+2

Si se trata de una colección captada con ganas, no es necesario cerrarla. Si es una colección floja, se mantendrá abierta la conexión a la base de datos y deberá cerrarla. No estoy seguro de cómo hacerlo si está dentro de un Android CursorAdapter @Sebastian. – Gray

+0

Lo siento por una pregunta para novatos: ¿es una colección floja por defecto? Tuve el mismo problema que @Sebastian, cerrar el iterador cuando el cursor está en uso provocó un bloqueo. En este momento estoy pasando el cursor de una clase Datamanager a un fragmento de lista y un Adaptador de cursor personalizado. Funciona, pero no estoy seguro de dónde y cuándo liberar el iterador. – jannej

6

Resulta No necesitaba una consulta SQL sin procesar con ORMLite después de todo, ya que necesitaba hacer una combinación a la izquierda (es decir, n OT como resultado de tener que cambiar el nombre de la columna id de una consulta, que no es necesario de acuerdo con la respuesta de gris arriba)

La forma en que lo hice es el siguiente:

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

Gracias por consejos

+0

FYI: Hemos agregado a la versión 4.22 LEFT JOIN capacidades a ORMLite. Fue lanzado. – Gray

Cuestiones relacionadas