Firebase überträgt Daten nicht richtig?

  • Im Debugger mit einem Brake im listner geht es richtig.


    Also existiren auch die drei listner.


    Bei einem normalen durchlauf wird das Handy beschäftigt sein wenn Firebas einen Lister aufruftweil es noch in einem andern Listner ist. Somit geht die daten Übergabe ins lehre . Bein Debugger geht es langsamer und ich bekomme auchalle logs.


    Du musst dein Konzept überarbeiten.


    denke es ist jetzt genug.

  • Ja, ich werde wohl versuchen müssen das irgendwie anderst zu lösen :/


    Kannst du mir gerade noch kurz sagen an welchen drei Listner es deiner meinung nach scheitert? Werde mir dann wohl die tage über etwas neues ausdenken müssen xD

  • Auch wenn du das Regatta abbrechen weg lest wir immer nur ein Listner aufgerufen. Die überschneiden sich.


    Entweder müssen die alle einzeln in Threads oder du macht nur einen Listner der dir alle daten der User in den dataSnapshot liefert und du kannst somit auch alle daten gleichzeitig berechnen.
    du machst das sowieso erst am ende wo alles gelaufen ist.

  • Code
    for(final Map.Entry e : zeitTabelle.entrySet()){
                    if(!e.getValue().toString().equals("00:00:00")) {
                        Log.i( "test","zeitberechnen for Schleife:"+ e.getKey());
    
    
                        //mit dem yardstick berechnen
                        mDatabase.child("users").child(e.getKey().toString()).addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

    die die du hier erstellst. drei user sind es drei oder bei 10 user eben 10.

  • Also ich habe jetzt einfach mal den Listener in der Zeitberechnung entfernt(der Yardstick wird jetzt sobald eine regatta gestartet wird direkt am anfang gespeichert)
    Trotzdem tritt der Fehler noch auf.
    Jetzt gibt es keinen Listener mehr der das ganze verhindern kann. Trotzdem ist es wieder so das es im Debugger einwandfrei funktioniert und ohne trägt es wieder nur eine einzige Person ein.


    Da hatte ich ihn entfernt

  • ich denke das Problem ligt hier

    Code
    if (berechnungsZähler >= auswahlAnzahl){
                                    Map<String, Integer> sortedMap = sortByValue(unsortMap);

    in den if zweig geht er nur in einem der drei listner rein und somit wird auch nur in dem einem Listner etwas geschrieben.

  • Ich brauche dort ja auch nichts lesen.
    Ich habe mir jetzt einfach eine Map erstellt in welche es mir alle yardsticks der benutzer reinspeichert.
    Das Passiert in der onCreate methode. Da rufe ich eh schon einmal meine datenbank auf von dem her macht es ja keinen unterschied.


    Der einzigste unterschied ist jetzt das ich mir den Listener dort in der Zeitmethode spare.
    Man sieht auch im Debugger das es die werte alle hat. also müsste es ja auch so gehen

  • Habe mittlerweile ein paar mal getestet. Wenn ich in der regattaAbbrechen() methode das System.exit(0); weglasse, tritt kein fehler mehr auf. wenn ich es wieder hinzufüge hab ich den fehler wieder.


    Hinfurz von mir... Die Datenbank funktioniert ja nicht Synchron. Durch dieses System.exit(0); passiert ja bei mir nicht anderes als das die app bzw die activity abstürtzt. Was wenn es dadurch abstürtzt noch bevor alle Daten übertragen werden konnten?


    Wenn ich es weglasse funktioniert es ja. Soweit prima. Dann habe ich das Problem das bei einer weiteren Regatta noch die alten zeiten der Teilnehmer vorhanden sind und manuell gelöscht werden müssen. Wie erreiche ich es das ich meinen Viewholder komplett zurücksetzen kann?

  • Hab jetzt auch ein paar Logs eingefügt. Einmal hier im Code. und einmal in der RegattaAbbrechen funktion.


    Java
    //bei neue Regatta
                                    if(auswahl.equals("Neue Regatta")){
                                        for (String key : alleUser.keySet()) {
                                            mDatabase.child("regatten").child(Integer.toString(regatten+1)).child("1").child(key).setValue(alleUser.get(key));
                                            Log.i("Test", alleUser.get(key).toString());
                                        }
                                        regattaAbbrechen();
                                    }

    An dieser stelle gibt es mir immer dann wenn es die Daten übertragen hat die Punktzahl im log aus.


    Einmal mit System.exit(0):
    Es schreibt mir kurz alle drei Werte in den Log. Die App Stürtzt ab. In der Datenbank selbst ist gerade mal ein wert angekommen.


    Ohne System.exit(0):
    Es schreibt mir dauerhaft alle drei Werte in den Log. In der Datenbank kommen alle werte an.


    Es muss ohne zweifel daran liegen.


    Dann habe ich das Problem das bei einer weiteren Regatta noch die alten zeiten der Teilnehmer vorhanden sind und manuell gelöscht werden müssen

    Allerdings habe ich dazu schon damals ewig recherchiert und nichts gefunden. Ich muss ja irgendwie alle Instanzen der Benutzer löschen. Fällt dir dazu eventuell ein Lösungsvorschlag ein?

  • Hallo mit exit (0) beendest du die activity und somit auch die erstellten listner. Wenn der erste Lister fertig ist und das exit macht haben die anderen kein Möglichkeit mehr den Code auszuführen und die Daten in die DB zuschreiben.
    Deshalb schreiben nicht im Listen.


    Außerdem wozu brauchst du 3 oder auch 10 listner (pro User einen) wenn du es sowieso erst am Ende der regatta nach der Dialog box Abfrage machst.
    Dann kannst du zu diesen zeitbunkt die Daten in die DB schreiben.
    Es würde ein listner reichen der dir alle Daten der User holt und zwar alle die an der Regatta teil genommen haben auf einmal. Nun kannst du rechnen und jedem seine Punkte dazu zählen und wider Speichen. Mache das alles in einem listner. Danach kannst du die activity verlassen beenden.


    Oder du lässt dir etwas einfallen woran du erkennst das alle Lister fertig waren aufgerufen wurden gespeichert haben und nur dann kannst du die activity beenden.


    Da sind wir wider bei meinen schon genannten if. Was du nicht beachten wolltest.


    Denn gleich nach dem Speichen der Daten im listner beendest du die activity. Somit gaben die anderen listner keine Chance mehr dann zu kommen. Weil die activity ist nach dem ersten listner beendet. Ein berechnen der akten Punkte mit den neuen Punkten der anderen User findet dann nicht mehr statt. Da die activity beendet und alle Instanzen der listner löscht sind.

  • Es würde ein listner reichen der dir alle Daten der User holt und zwar alle die an der Regatta teil genommen haben auf einmal.

    Genau das habe ich ja in bei der neuen Version gemacht. Den Listener hatte ich ja nur erstellt damit ich den Yardstick der einzelnen Teilnehmer bekomme.
    Da ich in der onCreate methode sowieso einen Listener habe der aus der Datenbank ausließt welche benutzer es gibt habe ich dort einfach gesagt er soll mir zusätzlich noch den Yardstick abspeichern. Ich hätte mir auch wie du sagst einmal alle Werte nach dem Dialog bestätigen holen können aber es stört ja nicht wenn ich es direkt ganz am anfang mache.
    So habe ich das beides gleich kombiniert. Dadurch erstelle ich in der Zeitberechnungs methode keine 3 oder 10 Listener, sondern nutze einen sowieso schon vorhanden.



    Nun kannst du rechnen und jedem seine Punkte dazu zählen und wider Speichen. Mache das alles in einem listner. Danach kannst du die activity verlassen beenden.

    Macht der jetzige Code ja. Er rechnet sofort die Punktzahl aus, den Yardstick dafür hat er schon seit erstellen der Activity. Ganz ohne Listener in der Methode.

    Da sind wir wider bei meinen schon genannten if. Was du nicht beachten wolltest.

    Nicht verstanden habe* xD


    Denn gleich nach dem Speichen der Daten im listner beendest du die activity. Somit gaben die anderen listner keine Chance mehr dann zu kommen. Weil die activity ist nach dem ersten listner beendet.

    Das leuchtet mir ein. Dann müsste es doch allerdings mit dem geänderten Code gehen, schließlich werden in der methode selbst keine Listener mehr benötigt oder?

    Oder du lässt dir etwas einfallen woran du erkennst das alle Lister fertig waren aufgerufen wurden gespeichert haben und nur dann kannst du die activity beenden.

    Ist warscheinlich nicht die schönste variante aber die Idee ist gut. Ich müsste ja nur eine abfrage machen ob von 3 Benutzern alle 3 in der Datenbank sind und erst wenn das Passiert ist beendet sich das Programm. Das probiere ich mal demnächst aus.

Jetzt mitmachen!

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