2012-09-14 13 views
12

Ich ändere meine Android App, um mit ORMLite zu arbeiten, und es verwendet derzeit eine Reihe von CursorAdapters, die ich in einem Versuch behalten möchte, Codierung zu minimieren.ORMLite mit CursorAdapter in Android

Ich bin nicht 100% sicher, aber t scheint, dass, wenn ORMLite ein ID-Feld in der Datenbank erstellt, immer id verwendet, während CursorAdapter _id benötigt.

Es ist möglich, das zu umgehen, indem eine Abfrage wie folgt aus:

select id as _id ...... 

aber die Dao.queryRaw() Methode gibt eine Liste, kein Cursor, so wie ich es getan habe, ist eine andere SQLiteOpenHelper Datenbank zu öffnen Verbindung und Verwendung rawQuery().

Das funktioniert, aber gibt es bessere Möglichkeiten, es überhaupt zu tun? Es scheint übertrieben zu sein, zwei getrennte Datenbankverbindungen zu haben und vielleicht später Probleme zu speichern.

+0

Entschuldigung, es scheint, dass diese Frage falsch ist. Ich habe mich geirrt, es ist möglich, Spalten _id mit ORMLite zu benennen, also schlug ich vor, diese Frage zu löschen, um Verwirrung zu vermeiden, es sei denn jemand hat etwas weiter hinzuzufügen. –

+2

Anstatt es zu löschen, würde ich vorschlagen, dass Sie es mit Ihrer Antwort beantworten behoben - jemand könnte dies hilfreich finden, vor allem Code Beispiele für, wie Sie den Cursor erstellt haben, um mit ORM – pjco

+1

unten getan haben. Du hast Recht - ich nutze nichts, um zu löschen, ich mache mir nur Sorgen, dass Leute über diese Art von Fehlinformation stolpern und die Leute vom Geruch fernhalten, aber die Antwort ist, sorgfältig zu lesen! –

Antwort

12

Ihre Kommentare zeigen an, dass Sie Ihr Problem bereits beantwortet haben. Sie können natürlich auch eine Spalte mit dem Namen „_id“ ORMLite mit erstellen:

@DatabaseField(generatedId = true) 
private int _id; 

oder

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

Wenn Sie mit Cursor s arbeiten dann sollten Sie auf an den last() und moveAbsolute(...) Methoden, um einen Blick nehmen die DatabaseResults Klasse. Außerdem verfügt die AndroidDatabaseResults (die Sie umwandeln können) auch über eine -Methode, die das zugrundeliegende Objekt Cursor zurückgibt und über zusätzliche Methoden getCount() und getPosition() verfügt.

Hier sind einige weitere Informationen über ORMLite und Cursor s:

Android Cursor with ORMLite to use in CursorAdapter

Sie können den Zugriff auf die Cursor bekommen so etwas wie die Verwendung von folgenden:

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

Ich habe gerade herausgefunden, dass der Iterator nicht geschlossen werden muss, während der Cursor verwendet wird (ich vermutete es). Wie gehst du damit um? Halten Sie es herum und schließen Sie es in 'onDestroy()'? – Sebastian

+2

Wenn es sich um eine eifrig abgerufene Sammlung handelt, muss sie nicht geschlossen werden. Wenn es sich um eine faule Sammlung handelt, wird eine Verbindung zur Datenbank geöffnet und Sie müssen sie schließen. Nicht sicher, wie man das macht, wenn man sich in einem Android CursorAdapter @Sebastian befindet. – Gray

+0

Entschuldigung für eine neue Frage: Ist die Sammlung standardmäßig faul? Ich hatte das gleiche Problem wie @Sebastian, Schließen des Iterators, wenn der Cursor verwendet wird, verursachte einen Absturz. Im Moment übergebe ich den Cursor von einer Datamanager-Klasse zu einem Listenfragment und einem benutzerdefinierten cursorAdapter. Es funktioniert, aber ich bin mir nicht sicher, wo und wann ich den Iterator freigeben soll. – jannej

6

Es stellt sich Ich brauchte eine rohe SQL - Abfrage mit ORMLite, da ich eine Linke Verbindung machen musste (dh n ot als Ergebnis der ID-Spalte in einer Abfrage umbenennen müssen, das ist nicht notwendig, da pro Antwort Greys oben)

So wie ich es tat, ist unten:

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

Vielen Dank für Beratung

+0

FYI: Wir haben die Version 4.22 LEFT JOIN-Funktionen zu ORMLite hinzugefügt. Es wurde gerade veröffentlicht. – Gray

Verwandte Themen