2012-09-14 5 views
12

Je suis en train de modifier mon application Android pour travailler avec ORMLite et utilise actuellement un certain nombre de CursorAdapters, que je veux bien garder dans une tentative de réduire au minimum le codage. Je ne suis pas sûr à 100% mais il semble que lorsque ORMLite crée un champ id dans la base de données, il utilise toujours id, alors que CursorAdapter a besoin de _id.ORMLite avec CursorAdapter dans Android

Il est possible de contourner cela en utilisant une requête comme suit:

select id as _id ...... 

mais la méthode Dao.queryRaw() retourne une liste, pas un curseur, donc la façon dont je l'ai fait est d'ouvrir une autre base de données SQLiteOpenHelper connexion et utilisation rawQuery().

Cela fonctionne, mais ce qu'il ya des meilleures façons de le faire du tout? Il semble exagéré d'avoir deux connexions de base de données distinctes, et peut-être stocker des problèmes plus tard.

+0

Désolé, il semble que cette question soit fausse. Je me suis trompé, il est possible de nommer les colonnes _id avec ORMLite, donc j'ai proposé de supprimer cette question pour éviter toute confusion à moins que quelqu'un ait quelque chose à ajouter plus tard .. –

+2

Plutôt que de le supprimer, je vous suggère de répondre le corriger - quelqu'un peut trouver cela utile, en particulier les exemples de code pour la façon dont vous avez créé le curseur pour travailler avec ORM – pjco

+1

ont fait ci-dessous. Vous avez raison - aucune suppression d'utilisation, je m'inquiète juste que des gens trébuchent sur ce type de désinformation et que cela décourage les gens, mais la réponse est de lire attentivement! –

Répondre

12

Vos commentaires indiquent que vous avez déjà répondu à votre problème. Vous pouvez certainement créer une colonne nommée « _id » en utilisant ORMLite:

@DatabaseField(generatedId = true) 
private int _id; 

ou

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

Si vous travaillez avec Cursor s alors vous voudrez peut-être jeter un oeil sur les méthodes last() et moveAbsolute(...) sur la classe DatabaseResults. En outre, le AndroidDatabaseResults (que vous pouvez lancer à) a également une méthode getRawCursor() qui renvoie l'objet sous-jacent et Cursor a getCount() et getPosition() supplémentaires méthodes.

Voici quelques informations supplémentaires sur ORMLite et Cursor s:

Android Cursor with ORMLite to use in CursorAdapter

Vous pouvez accéder à la Cursor en utilisant quelque chose comme ce qui suit:

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

Je viens de me rendre compte que l'itérateur ne doit pas être fermé tant que le curseur est utilisé (je l'ai deviné). Comment vas-tu prendre ça en charge? Gardez-le autour et fermez-le dans 'onDestroy()'? – Sebastian

+2

S'il s'agit d'une collection recherchée, elle n'a pas besoin d'être fermée. S'il s'agit d'une collection paresseuse, une connexion sera maintenue ouverte à la base de données et vous devrez la fermer. Vous ne savez pas comment faire cela si vous êtes dans un Android CursorAdapter @Sebastian. – Gray

+0

Désolé pour une question débutant: est-ce une collection paresseuse par défaut? J'ai eu le même problème que @Sebastian, en fermant l'itérateur quand le curseur est utilisé a causé un accident. En ce moment, je passe le curseur d'une classe Datamanager à un fragment de liste et un cursorAdapter personnalisé. Cela fonctionne mais je ne suis pas sûr où et quand libérer l'itérateur. – jannej

6

Il tourne out j'avais besoin d'une requête SQL brute avec ORMLite après tout comme je devais faire une jointure à gauche, (ie n ot en raison d'avoir à renommer la colonne id dans une requête, ce n'est pas nécessaire selon la réponse de gris au-dessus)

La façon dont je l'ai fait est ci-dessous:

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

Merci pour les conseils

+0

FYI: Nous avons ajouté à la version 4.22 des fonctionnalités LEFT JOIN à ORMLite. Il vient d'être libéré. – Gray

Questions connexes