2016-09-24 2 views
0

Ich versuche, einige Daten in einer Android SQLite-Datenbank zu erstellen und abzurufen.queryForAll gibt Null-IDs mit ORMLite Android zurück

Wenn ich die Daten mit create Methode hinzufüge, werden Objekte korrekt aktualisiert (die Lange ID ist gesetzt). Aber dann, wenn ich die Daten mit queryAll Methode abrufen, werden Objekte korrekt zurückgegeben, mit Ausnahme des ID-Attributs, das als null kommt. Ich bin mit Datenbankfeld-Tag mit generatedId Attribute auf true gesetzt, genau wie die Dokumentation sagt:

generatedId

Boolean, ob das Feld ein automatisch generierter ID-Feld ist. Der Standardwert ist false. Nur ein Feld kann dies in einer Klasse festlegen. Dies teilt der -Datenbank mit, dass für jede eingefügte Zeile automatisch eine entsprechende ID generiert wird. Wenn ein Objekt mit einer generierten ID mit der Methode Dao.create() erstellt wird, generiert die Datenbank eine ID für die Zeile, die zurückgegeben und im Objekt durch die create-Methode festgelegt wird. Einige Datenbanken erfordern Sequenzen für generierte IDs. In diesem Fall wird automatisch der Sequenzname generiert. Um den Namen der Sequenz anzugeben, verwenden Sie generatedIdSequence. Nur eines davon, id und generatedIdSequence kann angegeben werden. Siehe Abschnitt Felder mit generatedId.

Es ist meine Klasse:

@DatabaseTable(tableName = "LANGUAGE") 
public class Language { 

    @DatabaseField(generatedId = true, columnName = "language_id") 
    private Long id; 

    @DatabaseField(columnName = "language_locale") 
    private String locale; 

    @DatabaseField(columnName = "language_active") 
    private boolean active; 

    @DatabaseField(columnName = "language_name") 
    private String name; 

    // getters and setters... 

} 

ich die Daten wie folgt eingefügt:

Language pt = new Language(); 
pt.setActive(true); 
pt.setName("Português"); 
pt.setLocale("pt_PT"); 
dao.create(pt); 

Language en = new Language(); 
en.setActive(true); 
en.setName("English"); 
en.setLocale("en_EN"); 
dao.create(en); 

// here, both pt and en have an id, 1 and 2, respectively 

Aber wenn ich ausführen

dao.queryForAll() 

locale, aktive und Namen Attribute kommt in Ordnung, aber id ist null.

Irgendwelche ideia? Ich habe bereits versucht, commit nach zu rufen erstellen, aber nichts ändert sich.

+0

Sind Sie sicher, dass Ihre Datenbankkonfigurationsdatei vollständig aktualisiert wurde? Ich habe noch nie etwas davon gesehen oder gehört, besonders mit dem ID-Feld. Funktioniert 'dao.queryForId (...)' auch, aber nicht die ID? – Gray

+0

queryForId (übergibt ID 1 für Beispiel) gibt null zurück.Es ist sehr seltsam, es scheint, dass create method den Job erledigt, aber dann speichert die Datenbank die Entity ohne ID ... für meine Erfahrung muss ich einen kleinen Fehler haben und werde es nur durch try-error finden ... jede Hilfe ist geschätzt – rmpt

+0

Und die IDs werden korrekt/sequenziell von create-Methode zugewiesen, so scheint es, dass die Entitäten tatsächlich in der Datenbank sind. Denkst du, es kann ein Cache-Problem sein? – rmpt

Antwort

0

Schließlich hat es funktioniert. Gast was? Einfach Daten löschen und die App deinstallieren. Jetzt können Sie loslegen. Frag mich nicht genau warum, aber es muss etwas mit der ID Annotation zu tun haben. Zuerst war ich mit:

@DatabaseField(id = true, allowGeneratedIdInsert = true, columnName = "language_id") 

einen Fehler geben, dann habe ich auf eine andere Kombinationen geändert und irgendwo in der Mitte muss die Datenbank mit einigen Eigenschaften erstellt werden. Dann habe ich es zu der Konfiguration geändert, die in meiner Frage gezeigt wurde, aber funktionierte nicht, wie ich erklärte. Nach dem Bereinigen der App auf meinem Handy musste alles neu erstellt werden und die Datenbank wurde schließlich mit korrekten Eigenschaften erstellt.

Wenn Ihre Datenbank die Daten in Zukunft nicht korrekt speichert oder lädt, löschen und deinstallieren Sie die App.

Verwandte Themen