Fortsetzung der vorherigen Sitzung. https://qiita.com/KIRIN3qiita/items/4573d26187b8c9e53fc6
Dieses Mal erstellen wir eine Rangliste der Spielzeit als praktische Version der Echtzeitdatenbank.
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.
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.
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);
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