GreenDao alle Elemente laden mit Foreign Klassen

  • Hiho an alle sich hier rumtreibenden ;)


    Ich suche, wie der Titel schon sagt, einen Weg um in GreenDao alle Elemente einer Tabelle abzurufen. Mit loadAll() kriege ich zwar alle Elemente, allerdings werden die Klassen, die per Foreign-Key mit der Tabelle verknüpft sind, nicht mitgeladen.


    Hat jemand von euch eine Idee? :Android:

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Hiho an Dich. ;)


    Wenn ich Dein Anliegen richtig interpretiere, dann verfolgst Du den falschen Ansatz.
    Die Beziehungen werden immer erst dann nachgeladen, wenn Du auf die Relation zugreifst.


    Hast Du beispielsweise eine Tabelle 'Orders' mit einer Relation 'Customer', dann wird dir ein OrdersDao.loadAll(); nur sämtliche Orders zurückgeben und nicht einen einzigen Customer.
    (Was genau genommen auch korrekt ist: Du bekommst alle Elemente DIESER Tabelle [inklusive des Foreign-Key], doch kein Element ANDERER Tabellen.)


    Sobald Du aber explizit currentOrder.costumer() aufrufst, werden die Daten dynamisch nachgeladen und das Objekt erstellt.
    Eventuell hilft Dir für die normale Anzeige ja auch ein SimpleCursorAdapter, den Du entsprechend des Ergebnisses einer Raw Query konfigurieren kannst.


    Schau dazu doch mal in das Demo-Projekt NoteActivity.java.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hi,
    Danke für deine Antwort.


    Ich muss mal gucken.
    Denn ich meine, dass ich wenn ich es nur über currentOrder.customer() versuche, hätte ich eine GreendaoExeption bekommen. Ich werde das allerdings nochmal überprüfen oder den Weg über die Datenbank gehen.
    Und danke nochmal an die Erinnerung an das Beispielprojekt. Hatte ich mir damals angeguckt als ich die Datenbank geplant habe. Aber hatte vergessen, dass das da auch drinsteht.


    Dir noch einen schönen Donnerstag ;)

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • Es wäre halt wichtig zu wissen wie die Exception lautet und wie die Relations erstellt sind.


    Aktuell habe ich kein Projekt mehr mit GreenDao, deshalb kann ich da auch nicht mal eben schnell nachschauen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Hi,
    ich hänge hier mal die Exception an ;)


    Java
    E/AndroidRuntime﹕ FATAL EXCEPTION: main
        de.greenrobot.dao.DaoException: Entity is detached from DAO context
                at getInfo(Info.java:366)


    Line 366:

    Java
    if (daoSession == null) {
                    throw new DaoException("Entity is detached from DAO context");
                }


    Das bedeutet, dass keine DaoSession dafür exisitiert. Aber wie löse ich das?

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

  • +narf+
    Ich erinnere mich an die Fehlermeldung.
    Aber wie habe ich das damals gelöst? +grübel+


    Ach, richtig. Ich brauchte die Referenzobjekte da ja noch nicht sondern hab einfach den FK an die neue Activity übergeben.
    (Ist meiner Meinung nach simpler als das ganze Herumgeparcele…)


    Ansonsten hilft statt loadAll() ein loadDeep()…
    Dann wird (gemäß Dokumentation) auch die passende Session weitergereicht.


    Weitere Infos:
    Google Gruppe

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

    2 Mal editiert, zuletzt von Marco Feltmann ()

  • Wenn ich versuche, das ganze in dem Fragment neu zu laden, dann krieg ich eine NullPointerException.
    Auf der anderen Seite lädt er trotz loadDeep oder queryDeep immernoch keine Elemente der Relationen...


    Ein bisschen den Ablauf erklärend:

    • Lade alle Elemente in einer Datenbank-Klasse
    • Übergebe diese an eine SupportMapFragment, wo diese auf der Karte angezeigt werden.
    • Beim Klick auf einen Marker -> Öffne Activity mit Fragment
    • Der Fehler tritt auf.

    MfG,
    Christopher


    Eine gewisses Maß an Freundlichkeit kann man auch von Menschen im Internet erwarten.
    Das Forum basiert komplett auf der Freiwilligkeit ihrer Nutzer und diese sollen sich wohlfühlen! Daher seid bitte freundlich. Danke

    Einmal editiert, zuletzt von Kogoro-Christopher ()

  • Beim Klick auf den Marker möchtest Du vermutlich auf das Objekt zugreifen, welches vom Marker repräsentiert wird.


    Wie machst Du das?
    Wenn Deine DaoKlasse das serializable Interface bedient und Du es als serializable Extra an deine Activity übergibst, dann klappt das nicht.


    Wie bereits anderweitig angesprochen:
    "Ich brauchte die Referenzobjekte da ja noch nicht sondern hab einfach den FK an die neue Activity übergeben.
    (Ist meiner Meinung nach simpler als das ganze Herumgeparcele…)"


    Das Problem liegt dann meiner Erfahrung nach nicht am loadAll()/loadDeep(), sondern an der androideigenen Eigenheit geboren aus der Zeigerunfreundlichkeit Javas, keine Zeiger übergeben zu wollen: das Objekt wird gepackt, das Pack wird übergeben, ein neues Objekt wird aus dem Pack erstellt und dieses neue Objekt hängt dann nicht mehr persistent in der Datenbank, hat also dementsprechend keine eigene Session mehr.


    Ungefähr dasselbe erreichst Du, wenn Du von Hand ein Objekt anlegst und dessen Referenzen setzen möchtest bevor Du es der Datenbank zugefügt hast.


    Deshalb mein Workaround mit dem Foreign Key: Key an die Activity übergeben, passenden Datensatz an Hand des Keys laden und Infos anzeigen.

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!