Beiträge von Kurmuro

    Also neue hab eben rum getestet wie ein verrückter und weiß denke ich woran es liegt... ich weiß nicht wieso oder warum aber da kannst du mir eventuell weiterhelfen.


    Sobald alle Teilnehmer übertragen wurden ruft es ja die methode "regattaAbbrechen();" auf.
    Wenn ich regattaAbbrechen jetzt einfach auskommentiere werden alle Teilnehmer immer übertragen. Bei allen Handys.


    In dieser Methode habe ich das Problem das das ganze sich mehr als unsauber beendet. Kurz gesagt die Activity stürtzt da halt einfach ab.
    Das kommt durch das System.exit(0); was ich dort stehen habe.


    Ich hatte immer das Problem das es mir die alten vorhanden Daten nicht Löscht bzw ich nicht weiß wie ich sie gelöscht bekomme.


    Könnte darin der Fehler liegen? Wie bekomme ich die Activity sauber beendet sodass alle daten gelöscht sind? einfach finish(); zu sagen bringt leider nichts

    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 die listner auch nicht synchron hinder einander kommen sogar wenn du in einen listner bist kommt der andere und fängt auch an zu schreiben. Mache das nicht in jedem listner sondern einfach nur in der zeitberechnen Methode für alle vorhandene Teilnehmer.

    Also wenn ich das richtig verstanden habe meinst du einfach, der teil der das ganze hochläd soll auserhalb des listeners sein. Bzw am ende der Zeitberechnungs methode.
    Das hatte ich auch schonmal ausprobiert. Allerdings hab ich da wieder das Problem das es Asynchron läuft.


    Wenn ich es noch richtig weiß bekomme ich dann eine nullpointerexception. Er versucht dann als erstes die Punkte hochzuladen (welche noch garnicht ausgerechnet sind) und danach holt er sich den Yardstick und rechnet die punkte aus. Bzw würde er wollen wenn das programm weiterlaufen würde

    ja manchmal geht es aber meistens schmeißt er mich zurück auf die Seite neue Regata oder runde ohne ein die Methode zu gehen.
    Die Dialog box bekomme ich und ich sage auch ja. Aber er geht ohne in die Methode zu gehen und somit zu Speichen zurück.

    habe es eben auch ausprobiert. bei mir stoppt es



    Ich behalte momentan immer so ein bischen die datenbank im blick. Jetzt ist der fehler eben auch bei dir aufgetreten.

    In deinem fall speichert es sogar die Punktzahlen von allen Teilnehmern. Mit meinem Handy auch und am emulator auch. Wenn ich es jetzt allerdings an meinem zweithandy probiere passiert das selbe wie bei den ersten läufen. Es speichert nur einen einzigen wert

    Nein so funktioniert das ja auch nicht.
    Zeitberechnung wird ausgeführt, sonnst würde es ja garnichts machen.


    Du bist auf der Startseite, wählst regatta. Dann klockst du auf neue regatta. Dann fügst du beliebig viele Teilnehmer hinzu. Startest die zeit. Der timer fängt an zu zählen. Dann stoppst du die einzelnen Teilnehmer. Wenn alle gestoppt sind drückst du unten rechts auf fertig. Dann kommt ein Dialog den du bestätigen musst. Erst dann wird Zeitberechnung ausgeführt.
    Zeitberechnung ist eigentlich der falsche Begriff eigentlich beginnt da die punkte Berechnung.. Also mache aus der gestoppten zeit die zu speichernden punkte

    Entweder steh ich total auf dem Schlauch oder wir reden aneinander vorbei.
    Könntest du vielleicht ein code Beispiel geben?


    Sobald ich auf Stopp drücke rufe ich die speichermethode des viewholders auf. Ja das stimmt. Damit speichere ich die Zeit. In meiner Datenbank allerdings möchte ich ja nicht die zeit speichern sondern nur die Punktzahlen die sich aus dem rang der einzelnen zeiten ergeben.
    Heißt ich kann zu dem Zeitpunkt wo ich Stopp drücke nichts speichern.


    Beispiel: Teilnehmer eins kommt im Ziel an ich drücke auf stopp. Er hat genau 5 minuten gebraucht. Jetzt kann ich allerdings noch garnichts in die Datenbank speichern weil Teilnehmer zwei und drei noch unterwegs sind. Teilnehmer drei kommt nach 7 Minuten ins Ziel. Und Teilnehmer zwei kommt nach 10 minuten ins Ziel. Jetzt erst da alle Teilnehmer gestoppt wurden kann ich sagen das Teilnehmer eins erster ist also 1 punkt bekommt. Teilnehmer zwei war letzter also bekommt er 5,7 punkte und Teilnehmer drei war zweiter und bekommt 3 Punkte.
    Erst diese Punkte können gespeichert werden. Das löse ich ja aus sobald ich auf fertig drücke.

    Okay das wird ja leider doch komplizierter als erhofft...


    Könntest du das mit dem Speichern und updaten kurz nochmal erläutern?
    Ich versteh gerade nicht warum ein Update mir helfen kann. Ich bin absoluter Neuling der versucht sich so gut es geht alles selbst beizubringen und froh das der code bis dahin einigermasen funktioniert hat.


    Updaten macht in meinen augen ja nur dann sinn wenn sich z.b. nur ein wert ändert oder? In meinem Fall füge ich doch einmal komplett neue werte in meine Datenbank ein. Sei es bei einer Regatta oder einem Lauf.

    Für mich macht es auch keinen sinn immer alle user neu zu schreiben in dem Eventlistner.

    Ich muss sie doch allerdings neu schreiben... Bis sie geschrieben worden sind existieren sie ja garnicht in der Datenbank.



    Wenn du die daten des einzeln User Updates oder auch neu schreist in deiner ViewHoder Klasse ...

    Die Daten aus dem Viewholder haben ja an sich noch garnichts mit der datenbank zu tun... Im Viewholder wird ja nur gespeichert Teilnehmer sowieso hat in runde eins 5 minuten gebraucht, in runde 2 so und so lange etc.. Heißt ich muss am ende ja immernoch erstmal mir die Zeiten von allen benutzern aus der jeweiligen runde holen um überhaupt auszurechnen wie viel Punkte er bekommt. also mit wie vielen Punkten ich ihn erst in die datenbank schreibe.

    wo ist das?


    wenn ich in deiner Kalsse Regatta mir deine Ref mDatabase suche ist die Immer in einem Listner.

    Ups ich hatte übersehen das

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

    auch in dem Listener drin ist welcher mir den Yardstick ausliest.


    Aber wie bekomme ich das ganze dann auserhalb des Listeners ohne das es Asynchron läuft? Hab da nunmal das problem das der code einfach weiterläuft ohne zuerst sich die daten aus der datenbank zu holen O.o

    1. Es soll ja auch nie was sofort in die DB geschickt werden. Erst sobald er fertig Klickt also alle Teilnehmer im Ziel angekommen sind, kann ja auch berechnet werden.
    2. wenn ich es auserhalb des Listeners übertrage hab ich nunmal das Problem der Asynchronität bei der ich mir anderst nicht zu helfen weiß.
    3. Was ist an dem übertrageDaten() falsch? unsauber ja aber wieso falsch? bei jeder veränderung im viewholder übertrage ich meine daten in maps meiner regatta klasse. und aus diesen maps berechne ich ja meine Punktzahl.


    Wieso funktioniert es dann als wenn der Debugger läuft? Man merkt ich bin gerade etwas überfordert und versuch es zu verstehen :|

    Etwas schwer zu erklären und warscheinlich auch umständlich gelöst xD.
    In dem viewHolder gibt es zwar die methode übertrageDaten(), allerdings überträgt die mir die daten nicht in die datenbank sondern in meine Klasse Regatta.
    Das hat den Grund das es die funktion gibt teilnehmer hinzuzufügen bzw mitspielen zu lassen nachdem die ersten schon gestoppt wurden.
    Hätte ich jetzt alles nur in meinem Viewholder gespeichert und füge einen neuen Spieler dazu wird ja sozusagen eine Neue Liste gemacht, also alle daten wären.. weg? überschieben? auf jedenfall hatte ich dann keinen zugriff mehr. Das habe ich gelöst indem ich die Daten zwar in den Viewholder speichere allerding zusätzlich immer in meine Regatta Klasse. Somit kann ich später einfach fragen ob für den Teilnehmer schon daten existieren und sie wieder in den viewholder neu reinspeichern.


    Ja, mit der Zeile wird geschrieben.
    Das findet in dem Eventlistener statt weil ich erst rausfinden muss wie viele Läufe schon existieren um es auch richtig zu speichern.
    Der Grund weshalb ich es innerhalb des Listeners mache ist weil ich schonmal das Problem hat das das ganze Asynchron läuft. Hätte ich beispielsweiße die zeile zum übertragen auserhalb meines Listeners, dann versucht das Programm erst die Daten zu übertragen und startet danach erst den Listener... Was ja völliger schwachsinn ist da ich ja erst rausfinden muss wie viel vorherige läufe es gibt.


    Das kann allerdings nicht unsere Fehler ursache sein. Wir haben ja zwei arten es zu speichern. Einmal als lauf und einmal als regatta. Bei Regatta Option findet das ganze ohne den EventListner statt. Trotzdem funktioniert die übertragung (siehe foto) nur manchmal

    Hier siehst du wie es in der datenbank gespeichert wird. Regatta eins und zwei sind fehlerhaft. bei Regatta 3 hat es wieder geklappt.
    Du kannst dich auch gerne mal einloggen. Und es selbst Probieren.
    Du hast allerdings leider nicht die möglichkeit dir die datenbank selbst anzeigen zu lassen. Allerdings wird auf der Startseite ja die gesammt Plazierung angezeigt. Daraus kann man es sich ja herleiten. erster Platz 1 punkt, 2 Platz 3 Punkte, 3 Platz 5,7 Punkte. Wenn ein Teilnehmer nicht teilgenommen hat erhält er 99 Punkte. Auf der startseite werden die 99 punkte nicht angezeigt das hat den grund das dort geschaut wird wie viel spiele es insgesammt gab z.b. zwei stück. Hat ein Teilnehmer zweimal gefehlt hat er natürlich 198 Punkte. Also werden bei zwei spielen gesammt alle teilnehmer mit 198 Punkten nicht angezeigt. Bei vier spielen dann alle mit 396 Punkten usw.

    Wie gesagt ist das meine erste App, daher will ich nicht verwerfen das es Logig fehler gibt. Allerdings versteh ich gerade nicht über welchen Eventlistner du redest. Wo meinst du den wird er aufgerufen?


    Meinst du hier? Das ist soweit ich rausgefunden hatte meine einige Möglichkeit die Datenbank auszulesen.. In dem fall will ich übrigens rausfinden wie viele läufe schon existieren. Also wenn es 4 läufe gibt soll der nächste als lauf 5 gespeichert werden.

    Die Drawable habe ich gelöscht weil sie Daten von Vereinsmitgliedern enthalten. Sorry xD
    Ja, nur der Admin bzw der schiedsrichter in dem fall soll die zeit stoppen können. Das machen wir indem der normale Benutzer auf der Startseite garnicht den Button angezeigt bekommt um diese "Regatta", so nennt sich das, zu starten.


    Der Teil wo die Daten gespeichert werden habe ich oben geschickt.


    Es gibt die Klasse Regatta in der Quasi alles wesentliche gemacht wird. Auch die Daten übertragen zu verrechnen etc.
    Dann gibt es dort noch eine Klasse welche für die anzeige der einzelnen Benutzer zuständig ist. Da wird dann z.b. die zeit gestoppt und die gestoppte zeit dann in eine map von der Klasse Regatta gespeichert, in "userLastTime".


    Die Punkte werden in der Klasse Regatta, in der Methode Zeitberechnung übertragen. Wie meinst du genau wo wo er das macht...? Er klickt auf den finsih button, der onClickListener löst aus und startet die methode "rundenAnzahlBerechnung". Hier wird geschaut in welcher runde alle teilnehmer sind und welches die niedrigste runde ist. diese wird dann gewertet. sobald die niedrigste runde berechnet wurde startet sich die methode "displayConfirmView". Hier wird einfach nur angezeigt das z.b. die zweite runde gewertet wird. und ob das so richtig ist. sobald man auf ja drückt startet sich "zeitBerechnung". Hier werden erstmal die Zeiten der Teilnehmer aus der jeweiligen runde in die Map "zeitTabelle" gespeichert. Diese wird dann sortiert. Also wer ist als erste ins ziel gekommen. Dann wird die Zeit mithilfe eines Yardsticks (das ist dieser Persönliche wert) umgerechnet. Wer jetzt erster ist bekommt einen punkt. wer zweiter ist 3. Der dritte 5.7 usw. Diese Punkte werden in die Map "alleUser" gespeichert. Diese Map enthält alle Benutzer, am anfang mit 99 Punkten. Jeder der nicht Teilgenommen hat bekommt nämlich 99 Punkte. Jetzt wird in der zeitberechnungsmethode für alle teilgenommenen eine punktzahl errechnet welche die 99 Punkte einfach überschreibt.
    Dann wird egal ob es eine Regatta oder ein neuer lauf ist (einfach nur eine andere struktur zum abspeichern) die map alleuser komplett durchlaufen und mithilfe von

    Java
    mDatabase.child("regatten").child(Integer.toString(regatten+1)).child("1").child(key).setValue(alleUser.get(key));

    übertragen.


    Wie gesagt darf das nur der Admin (schiedsrichter) machen. Alle normalen Benutzer können nichts in die datenbank schreiben. Sie können nur lesen. Also um z.b. auf der startseite ihre gesammtplatzierung zu sehen. Später dann auch einzelte bewertungen der jeweiligen läufe und regatten (deshalb die unterteilung beim abspeichern).
    Wie du vielleicht schon rausgelesen hast ist das eine app für einen Segelverein. Der Schiedsrichter sitzt am rand und schaut den teilnehmern zu bzw stoppt ihre zeiten. Die Teilnehmer selbst können erst nachdem es gewertet wurde auf der startseite die gesammt plazierung sehen.
    Den rest vom Text muss ich erstmal noch kurz verstehen xD