[JAVA] Erstellen Sie ein klares Zeitranking mit der Echtzeitdatenbank von Firebase (Android-App)

Fortsetzung der vorherigen Sitzung. https://qiita.com/KIRIN3qiita/items/4573d26187b8c9e53fc6

Dieses Mal erstellen wir eine Rangliste der Spielzeit als praktische Version der Echtzeitdatenbank. qiita.png

Es ist ein klares Zeitranking-Bild des Änderungszahlungsspiels, das ich vor langer Zeit gemacht habe.

Selbst wenn Sie Ihre eigene Shobo-Spiel-App erstellen, wird sie ein wenig Gestalt annehmen, wenn es ein klares Zeitranking gibt. (Obwohl die Anzahl der Installationen ungefähr 100 beträgt ...) Höchste Zahlung (https://play.google.com/store/apps/details?id=jp.kirin3.changegame&hl=ja) Wenn Sie dies anwenden, können Sie auch Ranglisten erstellen.

Regelerstellung

Verwenden Sie $ Variables, um eine Regel zum Speichern von Benutzerdaten zu erstellen.

Informationen zu $ Variables --------------------------- Sie können einen Teil eines Lese- oder Schreibpfads erfassen, indem Sie eine Erfassungsvariable mit dem Präfix $ deklarieren. Dies fungiert als Platzhalter und speichert den Wert dieses Schlüssels zur Verwendung in der Regeldeklaration. ---------------------------

Ich habe eine Regel erstellt, um den Namen, die Uhrzeit, das Datum und die Uhrzeit sowie die Benutzer-ID für jeden Benutzer zu speichern.

Regel


{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
     "info": {
      ".read": true,
      ".write": true,
      "$user_id": {
        "name": {
          ".validate": "newData.isString() &&
                          newData.val().length < 9"
        },
        "time": {
          ".validate": "newData.isNumber()"
        },
        "date": {
          ".validate": "newData.isString()"
        },
        "user_id": {
          ".validate": "newData.isString()"
        }
      }
    }
  }
}

Es ist unangenehm, "user_id" im Element "$ user_id" zu haben, aber es ist praktisch, wenn es sich um ein Bild handelt, das Daten in derselben Hierarchie extrahiert.

Datenregistrierung

Erstellen Sie zunächst eine Klasse, die zum Speichern und Erfassen von Daten verwendet werden soll.

User


public static class User {
    public int rankingNo;
    public String name;
    public Double time;
    public String date;
    public String userId;

    //Leere Konstruktordeklaration erforderlich
    public User() {
    }

    public User(String _name, Double _time,String _date,     String _userId) {
        name = _name;
        time = _time;
        date = _date;
        userId = _userId;
    }
    public void setRankingNo( int _rankingNo ){
        rankingNo = _rankingNo;
    }

    public Integer getRankingNo(){
        return rankingNo;
    }
    public String getName(){
        return name;
    }
    public Double getTime(){
        return time;
    }
    public String getDate(){
        return date;
    }
    public String getUserId(){
        return userId;
    }
}

Datenregistrierung


//Derzeit wird UserId mit UUID erstellt. (Danach muss es in der Referenz gespeichert werden, damit es sich nicht jedes Mal ändert.)
String sUserId = UUID.randomUUID().toString();

User user = new User( "UMEHARA",5.3,"2019-10-21 09:00:27" ,sUserId);

//Holen Sie sich eine Instanz
FirebaseDatabase database = FirebaseDatabase.getInstance();

//Referenz erhalten, indem Sie den Dateipfad angeben
DatabaseReference ref = database.getReference("info");

//Daten registrieren
ref.child(sUserId).setValue(user);

Datenerfassung

Registrieren Sie die Terminaldaten nur einmal vor der Erfassung. (Ich werde später erklären, warum es notwendig ist)

Registrierung der Kündigungsdaten


public void SaveTerminal(){
    String userId = TARMINAL;
    String userName = "Terminal";
    Double time = 99999.9;
    String date = "1999-01-01 00:00:00";

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference("info");

    User user = new User( userName,time,date,userId );
    ref.child(userId).setValue(user);
}

Datenerfassung


//Benutzerdatenarray
public static ArrayList<User> sUsers;
//Maximale Anzahl von Rankings
final int OUTPUT_RANKING_NUM = 100;

FirebaseDatabase database = FirebaseDatabase.getInstance();
//Referenz erhalten, indem Sie den Dateipfad angeben
final DatabaseReference refUser = database.getReference("info");
//Nach klarer Zeit sortieren, maximale Anzahl von Erfassungen festlegen
refUser.orderByChild("time").limitToFirst(OUTPUT_RANKING_NUM + 1).addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
        User user = dataSnapshot.getValue(User.class);

        //Rang Rang wird auch im Objekt gespeichert
        sRankNo++;
        user.setRankingNo(sRankNo);

        //Wenn Sie die Beendigungsdaten erhalten, übergeben Sie sie an den Adapter und zeigen Sie sie in der Listenansicht an
        if( dataSnapshot.getKey().equals(TARMINAL) || sRankNo == OUTPUT_RANKING_NUM + 1 ){
            UserAdapter adapter = new UserAdapter(getApplicationContext(), 0, sUsers);
            sListView.setAdapter(adapter);
        }
        //Im Array speichern
        else {
            sUsers.add(user);
        }
    }
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    }
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {
    }
    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});

Fügen Sie die erfassten Daten in ein Array ein, übergeben Sie sie an den Adapter und zeigen Sie sie in ListView an. Die Daten werden nach Löschzeit sortiert und so eingestellt, dass bis zu 100 Elemente abgerufen werden. Da es nicht möglich ist, den Abschluss der Datenerfassung zu bestimmen, werden die Enddaten (die zuletzt zu erfassenden Daten) registriert, um das Ende der Daten zu bestimmen. Es gibt möglicherweise eine bessere Möglichkeit, es zu schreiben, z. B. "user_id" im Element "$ user_id" in der Regelanweisung, aber ich hoffe, Sie können darauf verweisen, da es immer noch funktioniert. Die Echtzeitdatenbank hat viele Gewohnheiten und ist schwierig zu verwenden.

Recommended Posts

Erstellen Sie ein klares Zeitranking mit der Echtzeitdatenbank von Firebase (Android-App)
Erstellen Sie eine Datenbank in einer Produktionsumgebung
Erstellen Sie eine neue App mit Rails
Ich habe versucht, eine einfache Karten-App in Android Studio zu erstellen
Erstellen Sie eine TODO-App in Java 7 Create Header
Von der Einstellung der Firebase-Echtzeitdatenbank bis zur einfachen Dateneingabe (Android-App)
[Android / Java] Betreiben Sie eine lokale Datenbank in Room
Ich habe versucht, eine Datenbankverbindung in der Android-Entwicklung zu verwenden
[Vollständige Programmierung] §5 Erstellen Sie eine Überprüfungsverwaltungs-App in Ruby
Erstellen Sie ein Servlet-Programm in Eclipse
Versuchen Sie, eine Server-Client-App zu erstellen
Ich habe eine passende App erstellt (Android App)
[Kotlin / Android] Erstellen Sie eine benutzerdefinierte Ansicht
[Android] Ich habe eine Schrittzähler-App erstellt.
So erstellen Sie eine Zip-Datei beim Gruppieren von Datenbanksuchergebnissen in Java