Ich möchte Dokumente in MongoDB durchlaufen. Grundsätzlich ist hier die Situation. Ich habe einige JTextfields, die ich aus MongoDB auffüllen möchte. Jedes Mal, wenn der Benutzer auf die Schaltfläche Weiter klickt, muss ein neuer Datensatz abgerufen und im JTextField angezeigt werden. Hier ist mein Code:
%Vor%Es funktioniert jedoch nicht. Es zeigt nur den ersten Datensatz an, wenn ich die nächste Taste drücke. Wenn ich
ändere %Vor%bis
%Vor%Es wird nur der letzte Datensatz angezeigt. Hilfe bitte?
Wie Kevin bereits erwähnt hat, ist das Problem, dass Sie bei jedem Drücken einer Taste einen neuen Cursor holen, damit er immer von vorn beginnt. Es gibt zwei mögliche Ansätze, die dieses Problem beheben werden.
Hole den Cursor einmal und bewege ihn beim nächsten Drücken. Um dies zu tun, machen Sie den Cursor ein Feld, und holen Sie den Cursor im Konstruktor des Hörers.
%Vor%Die nächste Alternative besteht darin, die Anzahl der abgerufenen Elemente zu zählen und die Anzahl der Überspringungen des Cursors zu aktualisieren:
%Vor%Der erste Ansatz ist wahrscheinlich etwas schneller. Mongo kann diese Iteration mit einer einzigen Baumdurchquerung durchführen (im Gegensatz zu vielen für den zweiten Ansatz).
Bei der zweiten Methode bleibt der Cursor zwischen den Klickern nicht geöffnet. Dies ist wichtig für die Skalierbarkeit von Web-Anwendungen zwischen Anfragen, ist aber bei einer GUI-App nicht so wichtig (besonders, wenn die Anzahl der gleichzeitigen Benutzer kleiner ist).
Ein weiterer großer Vorteil des zweiten Ansatzes besteht darin, dass Sie rückwärts gehen können - DBCursor
hat keine previous()
-Methode, Sie müssen also diese Methode verwenden, wenn Sie jemals eine Schaltfläche "Zurück" hinzufügen.
Einige andere Dinge, die Sie wahrscheinlich tun sollten:
Fügen Sie eine indirekte Ebene hinzu, damit Ihr GUI-Ereignisbehandlungscode und Ihr MongoDB-Datenzugriffscode nicht ganz so stark gekoppelt sind. Dies wird Ihnen eine Menge Ärger ersparen, wenn Sie zu einer anderen Datenbank wechseln (vielleicht unwahrscheinlich) oder eine vorherige Schaltfläche hinzufügen, die in die gleiche Abfrage integriert ist (vielleicht eher).
Denken Sie daran, den Cursor zu schließen, wenn Sie damit fertig sind. DBCursor
Implementierungen leak und müssen mit einem Timeout-Schema bereinigt werden, wenn sie nicht explizit geschlossen werden. Dies gilt insbesondere, wenn Sie nicht die gesamte Ergebnismenge vollständig durchlaufen. Dies gilt auch für die Mongo-Instanz, aber Sie benötigen nur eine einzige für die gesamte Anwendung.
Das Problem ist, dass Sie jedes Mal einen neuen Cursor holen. Es zeigt also nur den ersten Datensatz. Ich nehme an, dass Sie mehr als ein Textfeld haben, wenn Sie alle Initialisierungen in einer Funktion durchführen wollen, müssen Sie auf einem Array von Textfeldern arbeiten, nicht auf einem einzigen. Wenn Sie actionPerformed mehrmals aufrufen möchten (einmal für jedes textField), sollten Sie einen bestimmten Status (z. B. den Cursor) zwischen den Aufrufen von actionPerformed beibehalten. Ich mache jedoch nicht viel GUI-Programmierung, daher bin ich mir nicht sicher, welche auf der Grundlage des von Ihnen bereitgestellten Code-Snippets korrekt ist.