Das er mich immer wider zurück geschikt hat war wohl mein Fehler ich hatte auf der übertrageDaten() einen Brack. Und danach brach er ab.
Ok du macht das durchlaufen der Zeitberechnen Methode erst am ende. Somit können die User auch erst am ende etwas sehen. Ich dachte das würde immer gemacht.
Wenn das so ist macht es für mich absolut keinen sinn mehr die daten in jedem Listner immer wieder neu zu schreiben. Wenn du 10 User hast wir das auch drei mal in die DB geschrieben. 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. Nicht im listner. Nach der Methode ist ja sowieso Schluss. Ich bin die ganze Zeit davon ausgegangen das das alles immer in der Db hast und die Teilnehmer es immer mit verfolgen können. Das Problem ist dass du das 10 mal speicherst obwohl ein mal reichen würde.
Beiträge von nono124
-
-
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. -
genau so hab eich es gemacht und es geht nicht.
-
dann benutze die auch mal. zeitBerechnung ung wird nie aufgeruven in der Klasse Regatta.
-
pushe dein github mit der richtigen version
bei der version die im gitHub ist ist es nicht so. habe nichts verändert geht überhaupt nicht . habe einen Brackponit in die methode gesetzt wird nie aufgerufen .
-
Hallo habe es eben mit deinen Zugangs daten mal etwas durchgespielt.
Wie ich mir dachte wird wenn ich eine neue Regatta mache user auswähle und dann auf Start drücke deine Methode zeitberechnen nicht aufgerufen. Es gibt auch nur einen Aufruf der Methode in deinem Code. Zeile 195
Somit wird gar nichts in die DB geschrieben .
Eigentlich sinnlos so etwas. -
Zitat
Ich muss sie doch allerdings neu schreiben... Bis sie geschrieben worden sind existieren sie ja garnicht in der Datenbank.
Genau das ist das Problem.
endlich hast du es erkannt.Da du alle User speichert geht das manchmal um genau zu sein werden die date in einen nicht zu dem user gehörenden Lister mit gespeichert gespeichert. Denn das speichern aller User machst du ja in allen listnern, die in der ersten for schleife erstellt werden.
Wird kein listender aufgerufene geht gar nichts.
Du musst die daten in die db speichern wenn sie entstehen also wenn du auf stopp drückst. In diesem klicklistner rufst du die speichermetrote der ViewHolder Klasse auf. Soweit richtig. Aber jetzt musst du genau den einen DatenSatz auch speichern. Oder wenn er schon existiert updaten.
Das speichern aktualisieren in der Eventlistnern der zeitBerechnungs Methode wird immer zu felern führen und solltest du nicht machen. Glaube mir und versuche es anders. Wenn du es schon nicht verstehen willst mach es einfach. -
userRef.child('mike').update({'dateOfBirth': moment(value.dateOfBirth).toDate().getTime()})https://medium.com/@hasangi/wr…h-javascript-f26113ec8c93
-
Das ganze geht einigermaßenweil du beim speichern alleUser in einer For schleife speicherst.
Aber genau das solltest du nicht in der View holder klasse machen und da genau nur den einen aktuellen User.
Eigentlich solltest du die daten in der DB nicht speichern sondern Updaten wiedas jetzt in der Firebase db geht muss ich erst nach schauen mache ich zu wenig.
Aber wenn du nur den einen User neu speicherst sollte das auch gehen.
Beieiner SQL gibt es insert und ubdate wie es hier ist Weiß ich jetzt nicht im Moment
Für mich macht es auch keinen sinn immer alle user neu zu schreiben in dem Eventlistner.
Denn nur dadurch geht es bedingt.
Wenn du die daten des einzeln User Updates oder auch neu schreist in deiner ViewHoder Klasse werde sie auch anschießend ordentlich angezeigt weil nach den schreiben wird auch der Lissner des Users aufgerufen und zeigt an. -
weil die daten nur übertragen werden wenn der listner aufgerufen wird. und wenn du klickst wir er ganz bestimmt nicht von der DB aufgerufen den der Inhalt des Child auf das er schaut hat sich nicht geändert.
Schaue dir an wann und zu welchen Zeitpunkt du in die onDataChange Methode des jeweiligen Teilnehmer kommst. Denn listner gibt es so oft wie Teilnehmer.Und nur wenn du in dieser Methode bist speichert du was in die db sonst nicht. die daten sind zwar lokal gespeichert in den Variablen der ViewHolder Klasse (die git es auch so oft wie Teilnehmer) aber nicht in der db.Ich verstehe nicht warum du das speicher nicht im Viewholder machen kansst. Du hast ad alle daten des Teilnehmer wenn nicht frage sie aus der Db ab.Dann sind die daten auch sofort nach dem klick aktuell und nicht irgend wann. Wann das ist kannst du nicht bestimmen.
-
Zitat
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.
und das ist flasch wird nie etwas werden auf diese art.
Überlege dir ein sinnvolles ordentliches Prinzip das wird nie nichtig laufen
ZitatBei Regatta Option findet das ganze ohne den EventListner statt. Trotzdem funktioniert die übertragung
wo ist das?
wenn ich in deiner Kalsse Regatta mir deine Ref mDatabase suche ist die Immer in einem Listner.
-
bei keinen deiner klicks wird etwas sofort an die dB geschikt.
Wieso musst du in dem ich sage mal anzeige listner der dir die daten hollt und anzeigt . ausch scheiben. Ist total falsch wird nie sinnvol laufen. Wenn sich du klickst musst du selber die DB schreiben und das nicht den anzeigelister Überlassen.
Auch solltest du zu diesen Zeitpunkt die punkte Zeiten usw berechnen und in der Db mitspeichert . dann sind sie auch zeitgleich beim
Teilnemer. Der brauch dann auch nichts berechnen.
So zu deiner App welche Klasse und Layout sieht den der Teilnehmer?
-
ich glaube du hast das Prinzip der Db noch nicht verstanden wie gespeichert und wie etwas gelesen werden kann. das ist eine Realtime Db die das lesen über listner macht. Schreiben direckt. Ohne Listner.
Schreibst du in einem Listner schreibt er nur wenn du auch im listner bist also die daten verändert oder du neu die daten lesen muss weil du vorher auf einer anderen Activity warst. -
Code
Alles anzeigenlass ViewHolder{ TextView name, time, rundeTV; Button btnStop, btnClear, btnRundeEntfernen, btnRundeHinzufügen; //Ist der Spieler editierbar (Wurde die Zeit schon für den Spieler gestoppt?) Boolean editable = true; //ID des Spielers String id; //Die gespeicherten Runden Zeiten List<String> lastTime = new ArrayList<>(); //die momentan angezeigte Runde int runde = 1; //Wie oft wurde zurückgedrückt (welche Runde wird momentan angezeigt) int zurückGedrückt = 0; public void übertrageDaten(){ Regatta.isUserEditable.put(id, editable); Regatta.runde.put(id, runde); Regatta.zurückgedrückt.put(id, zurückGedrückt); Regatta.userLastTime.put(id, lastTime); } }
hier wird nichts an die db übertagen .
-
das ist der eventlistner von den wier reden
mDatabase.child("users").child(e.getKey().toString()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override........wo anders findet kein speichen in die Db stat.
-
So ich noch mal
Wo genau bei was ist dein Problem? Beschreibe das genau.
Ich gehe doch wohl richtig in der Annahme das mit dieser Zeile in dem Eventlistner etwas in die Db geschrieben wird.
mDatabase.child("regatten").child(Integer.toString(regatten)).child(Integer.toString(lauf+1)).child(key).setValue(alleUser.get(key));
„setValue“ schreib nach meiner Auffassung auch in die DB.
Und das in dem EventListner finde ich merkwürdig.
Stoppen … tust du in einen Clicklistner und in dem ViewHolder Methode willst du speichern.
Nur ersten wo wird die ID gesetzt?
Wo ist da der Bezug zurDB zum speichern in der Methode ÜbertrageDaten?
Das wird bestimmt nicht in der Db ankommen .
Auch komisch ist das du das put schonindem OnClicklistner machst und dann nochmal die ÜbertrageDten Methode aufrufst.
Zb Regatta.userLastTime.put(viewHolder.id, viewHolder.lastTime);
viewHolder.übertrageDaten(); Für mich speicherst du garnichts in die DB kann kein Pusch, setValue und auch keine Ref auf die DB erkennen. So wie dein Code jetzt ist speicherst du nur in den Eventlistnern. Woanders nicht.Und das ist total falsch wird nie hundertprozentig gehen. Wenn du den Button stopp drückst solltest du auch das gleich in die DB speichern. Und nicht erst wenn ein Event Eintritt wenn überhaupt eines kommt. -
Hallo poste deinen Code so kommen wir hier nicht weiter.
-
Hallo
Habe es mir nur kurz angesehen. Konnte die App nicht Starten da einige Drawable fehlen. Und ich habe andere genommen.
Um es zu testen müsste ich mich aber an deiner DB anmelden habe ich noch nicht.
Noch mal etwas zum Grund Verständnis deiner APP.
Es ist so das nur der Admin die Zeit Starten und Stoppen kann. Richtig?
Wo in welcher Klasse und Methode machter das . Wie macht erdas ich denke in einem onClicklistner nicht in einem ValueEventListener. Hoffe ich zu mindestens damit meine ich den teil wo die Daten in die DB geschrieben werden.
Was kann der Teilnehmer machen? Wo kann er Daten in die DB eingeben? Wenn ja welche?
Macht er das bewusst in einen OnClickListner?
Wie wird die Methode von gestern ZeitBerechnung aus gelöst?
Wo in welcher Klasse und Methode kann der Teilnehmer was in die DB Schreiben?Wie ist das hast nur du die App auf dem Handy und bedienst die auch wehrend einer Regatta oder können die Teilnehmer das auch zwischendurch machen?
Oder können die Teilnehmer zwischendurch nur lesen? Wenn Ja welche Klasse Methode.
Zurück zu dem Thema von gestern. Für mich ist das zeitlich nicht ganz richtig.
Du hast deine Liste die du in der for Schleife durchgehst. Für jedes Element erstellst du einen Eventlistner.
Aber nur wenn sich auch etwas etwas in den Daten verändert hat wird er aufgerufen wann das ist unklar. Mit Sicherheit nicht wenn deine for schleife läuft. Und nur wenn du in dem Listner bist können auch daten in die Db geschrieben werde. So ist zumindest dein Code.
Ich die Erstellten Eventlistern sind auch noch nach dem durchlauf der For schleife aktiv und reagieren alle unabhängig von einander auf Veränderung der Daten auf die sie sich beziehen.
Erst wenn die Avtivityverlassen wird werden die Listner wahrscheinlich beendet.
Wer kann den die Methode Zeitberechnung auslösen.? Wie oft wird das gemacht?
Bemerken möchte ich noch auch wenn der Teilnehmer gestoppt wurde läuft der Eventlistern weiter und führt seinem Code aus.
Der Listner ist nach dem ersten Aufruf immer aktiv. Kommt zu ihm ein Event weil sich daten geändert haben wird der code ausgeführt und eventuell auch etwas in die DB gespeichert.
Für mich ist hier ein Logik Fehler.
Wenn ein Teilnehmer gestoppt wird finde ich nichts was den Eventlistner löscht. Oder das der Listner weis das gestoppt wurde und er nichts mehr zu tun hat wenn noch ein Event kommt. -
Ich schaue es mir morgen oder in den nächsten Tagen mal genauer an.
-
Und da scheint das Problem zu liegen. Denn nur wenn daten geändert werden wird bei den anderen Teilnehmernder listner aufgerufen und sie haben die Möglichkeit etwas zu senden . sonnst nicht . wenn keiner etwas ändert steht das ganze ding.
ZitatSystem.currentTimeMillis() wird Local gemacht. Was hätte es für einen Vorteil die Serverzeit zu benutzen? Die Teilnehmer stoppen kann sowieso nur eine einzige Person später heißt das Problem mit Zeitmanipulationen vom Benutzer selbst wird nicht passieren.
ok aber der der Stopt sollte die Möglichkeit habe außerhalb des listners daten zu senden sonst wird das nicht ordentlich laufen.