[JAVA] Créez un classement temporel clair avec la base de données en temps réel de Firebase (application Android)

Suite de la session précédente. https://qiita.com/KIRIN3qiita/items/4573d26187b8c9e53fc6

Cette fois, nous créerons un classement du temps de jeu clair comme une version pratique de Realtime Database. qiita.png

C'est une image claire de classement temporel du jeu de paiement de changement que j'ai créé il y a longtemps.

Même si vous créez votre propre application de jeu de shobo, elle prendra un peu forme s'il existe un classement temporel clair. (Bien que le nombre d'installations soit d'environ 100 ...) Paiement suprême (https://play.google.com/store/apps/details?id=jp.kirin3.changegame&hl=ja) Si vous appliquez cela, vous pouvez également faire des classements par score.

Création de règles

Utilisez $ Variables pour créer une règle pour stocker les données par utilisateur.

À propos de $ Variables --------------------------- Vous pouvez capturer une partie d'un chemin de lecture ou d'écriture en déclarant une variable de capture avec le préfixe $. Il agit comme un caractère générique et enregistre la valeur de cette clé pour une utilisation dans la déclaration de règle. ---------------------------

J'ai créé une règle pour enregistrer le nom, effacer l'heure, effacer la date et l'heure et l'ID utilisateur pour chaque utilisateur.

règle


{
  /* 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()"
        }
      }
    }
  }
}

Il est désagréable d'avoir "user_id" dans l'élément "$ user_id", mais c'est pratique si c'est une image qui extrait des données dans la même hiérarchie.

Enregistrement des données

Tout d'abord, créez une classe à utiliser pour le stockage et l'acquisition de données.

User


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

    //Déclaration de constructeur vide requise
    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;
    }
}

Enregistrement des données


//Pour le moment, UserId est créé avec UUID. (Après cela, il faut le sauvegarder dans la référence pour qu'il ne change pas à chaque fois)
String sUserId = UUID.randomUUID().toString();

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

//Obtenez une instance
FirebaseDatabase database = FirebaseDatabase.getInstance();

//Obtenir une référence en spécifiant le chemin du fichier
DatabaseReference ref = database.getReference("info");

//Enregistrer les données
ref.child(sUserId).setValue(user);

L'acquisition des données

Enregistrez les données du terminal une seule fois avant l'acquisition. (J'expliquerai pourquoi c'est nécessaire plus tard)

Enregistrement des données de résiliation


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

L'acquisition des données


//Tableau de données utilisateur
public static ArrayList<User> sUsers;
//Nombre maximum de classements
final int OUTPUT_RANKING_NUM = 100;

FirebaseDatabase database = FirebaseDatabase.getInstance();
//Obtenir une référence en spécifiant le chemin du fichier
final DatabaseReference refUser = database.getReference("info");
//Trier par temps d'effacement, définir le nombre maximum d'acquisitions
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);

        //Le rang de classement est également enregistré dans l'objet
        sRankNo++;
        user.setRankingNo(sRankNo);

        //Lorsque vous recevez les données de terminaison, transmettez-les à l'adaptateur et affichez-les dans la vue de liste
        if( dataSnapshot.getKey().equals(TARMINAL) || sRankNo == OUTPUT_RANKING_NUM + 1 ){
            UserAdapter adapter = new UserAdapter(getApplicationContext(), 0, sUsers);
            sListView.setAdapter(adapter);
        }
        //Enregistrer dans la matrice
        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) {
    }
});

Placez les données acquises dans un tableau, transmettez-le à l'adaptateur et affichez-le dans ListView. Les données sont triées par heure d'effacement et sont configurées pour récupérer jusqu'à 100 éléments. Puisqu'il n'est pas possible de déterminer l'achèvement de l'acquisition de données, les données de fin (les données à acquérir en dernier) sont enregistrées pour déterminer la fin des données. Il peut y avoir une meilleure façon de l'écrire, comme "user_id" dans l'élément "$ user_id" dans l'instruction de règle, mais j'espère que vous pourrez vous y référer car il fonctionne toujours. Realtime Database a beaucoup d'habitudes et est difficile à utiliser.

Recommended Posts

Créez un classement temporel clair avec la base de données en temps réel de Firebase (application Android)
Créer une base de données dans un environnement de production
Créer une nouvelle application avec Rails
J'ai essayé de créer une application cartographique simple dans Android Studio
Créer une application TODO dans Java 7 Créer un en-tête
De la configuration de Firebase Realtime Database à la simple saisie de données (application Android)
[Android / Java] Exploitez une base de données locale dans la salle
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
[Programmation complète] §5 Créer une application de gestion des avis dans Ruby
Créer un programme Servlet dans Eclipse
Essayez de créer une application client serveur
J'ai créé une application correspondante (application Android)
[Kotlin / Android] Créer une vue personnalisée
[Android] J'ai créé une application de podomètre.
Pour créer un fichier Zip lors du regroupement des résultats de recherche de base de données en Java