code it

Martins Tech Blog

GreenDao ... und wo sind meine Daten?

In meinen Android-Projekten verwende ich gern GreenDao als OR-Mapper, denn es ist einfach zu verwenden und nach Aussagen des Herstellers auch performant und ich habe bisher keinen Grund gehabt daran zu zweifeln.

Heute bin ich über ein mir zunächst nicht erklärbares Phänomen gestolpert, das sich im Nachhinein mit Performance-Optimierungen im GreenDao-Core erklären lässt.

Aber ich beginne von vorn. Meine App hat einen klassischen Aufbau - eine Liste und per Klick auf einen Eintrag sieht man die Details und kann diese editieren. Jeder dieser Einträge hat nun noch datumsabhängige Sub-Daten. 

Um es zu verdeutlichen: Wald - Baum - Stammumfang pro Tag.

Da ich sowieso den Baum identifizieren und dessen Daten anzeigen musste, habe ich wie folgt auf die Daten zugegriffen:
Tree tree = _daoSession.getTreeDao().load(id);
List<MeasuringValue> mvls = tree.getMeasuringValueList(); 

Das Speichern der eigentlichen Daten erfolgt dann auch ganz nach Doku.
MeasuringValue mv = new MeasuringValue();
mv.setTreeId(id);
mv.setDate(date);
mv.setCircumference(circumference);

_daoSession.getMeasuringValueDao().insert(mv);

Das Phänomen ist nun gewesen, dass beim erneuten Aufrufen die neu gespeicherten Datensätze zunächst nicht vorhanden waren. Das Problem war mit debugging auch nicht nachvollziehbar - alles funktionierte korrekt und war auch auslesbar. Noch seltsamer: auch ohne angehängten Debugger waren die Daten die zunächst nicht angefügt schienen nach einigen Minuten doch enthalten.

Wie schon geschildert verwendet GreenDao einen Cache und der scheint hier das Problem zu sein, da ich die Daten auf einem anderen Weg auslese als ich sie einfüge. Beim Auslesen gehe ich über den Fremdschlüssel von Tree, beim Einfügen gehe ich direkt über die Messwert-Tabelle.

Das Problem lässt sich umgehen, indem man den Cache von GreenDao leert. 
_daoSession.clear();
Nachteil: man tauscht aktuelle Daten gegen den Performancevorteil ein - und so wäre die richtigere Lösung die Daten über den gleichen Weg auszulesen wie man sie anfügt.