[JAVA] [Android] J'ai quitté SQLite et essayé d'utiliser Realm

introduction

L'existence d'une "base de données" que toute personne développant Android rencontrera une fois. Si vous avez déjà touché SQL, SQLite est une bonne chose, mais je ne le suis pas. J'ai donc décidé de me faire aider par un chat, et quand j'ai recherché divers plug-ins, je suis tombé sur "Realm". Il a déjà été utilisé dans diverses applications, et on a dit qu'il avait une certaine réputation dans le domaine iOS, j'ai donc décidé de jouer avec.

realm.gif

Environnement de développement

Introduit immédiatement

Ajoutez le code suivant au gradle directement sous le projet.

build.gradle


buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:2.3.3'
    classpath 'io.realm:realm-gradle-plugin:3.5.0' //ajouter à
  }
}

Ensuite, ajoutez le code suivant au gradle de l'application pour laquelle vous souhaitez créer une base de données à l'aide de Realm.

build.gradle


apply plugin: 'realm-android' //ajouter à

dependencies {
  compile fileTree(include: ['*.jar'], dir: 'libs')
  compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
  compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
  compile 'com.android.support:support-v4:26.0.0-alpha1'
  compile 'io.realm:android-adapters:2.1.0' //ajouter à
}

(Veuillez ajuster la version etc. de chaque bibliothèque de support en fonction de chaque environnement.)

Essayez de mettre en œuvre

  1. Création de modèles La conception de table la plus importante pour la construction d'une base de données. Realm facilite la conception. L'exemple de code est illustré ci-dessous.

    public class Friend extends RealmObject {
    
      @PrimaryKey
      private String address;  //colonne d'adresse
      private String name;  //colonne de nom
    
      // getter setter...
      public String getName() { return name; }
    
      public void setName(String name) { this.name = name; }
    
      public String getAddress() { return address; }
    
      public void setAddress(String address) { this.address = address; }
    
    }
    

J'ai défini un paramètre de type String "adresse" (colonne) et un paramètre de type chaîne "nom" (colonne) dans un objet (enregistrement) appelé Friend. En dessous, définissez les Getters et les Setters pour lire et écrire les valeurs dans chaque colonne. Cette fois, je voulais définir la colonne d'adresse comme clé primaire, j'ai donc ajouté l'annotation @ PrimaryKey. D'autres annotations et explications détaillées peuvent être trouvées dans la documentation officielle. La création de modèle est relativement flexible dans Realm, vous pouvez donc faire la plupart des choses en écrivant de plus en plus d'annotations et votre propre méthode. De plus, en écrivant votre propre méthode, vous pouvez améliorer la lisibilité sans écrire les opérations fréquemment effectuées du côté du contrôleur.

  1. Afficher la création Nous allons créer un exemple d'écran pour ajouter des données au modèle (table Friend) créé précédemment et un écran pour afficher une liste. --Ajouter des données (s'inscrire comme ami)

    ```fragment_addfriend.xml
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:tools="http://schemas.android.com/tools"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:background="@color/White"
                tools:context=".AddFriendFragment">
    
      <EditText
        android:id="@+id/address_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:ems="12"
        android:hint="adresse"
        android:inputType="text"
        android:maxLines="1"/>
    
      <EditText
        android:id="@+id/name_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/address_text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:ems="12"
        android:hint="Nom"
        android:inputType="text"
        android:maxLines="1"/>
    
      <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/name_text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="enregistrement"/>
    
    </RelativeLayout>
    ```
    

Ajoutez EditText qui accepte l'entrée de l'adresse et du nom et le bouton de la boîte de dialogue de confirmation d'enregistrement.

Ajoutez RecyclerView à la liste.

    ```row_friend.xml
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="10dp">
    
      <TextView
        android:id="@+id/label1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Nom:"/>
    
      <TextView
        android:id="@+id/name_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/label1"
        android:layout_toEndOf="@+id/label1"/>
    
      <TextView
        android:id="@+id/label2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/label1"
        android:layout_below="@+id/label1"
        android:layout_marginTop="10dp"
        android:text="adresse:"/>
    
      <TextView
        android:id="@+id/address_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/label2"
        android:layout_toEndOf="@+id/label2"/>
    
    </RelativeLayout>
    ```

Ajoutez un TextView qui affiche respectivement le nom et l'adresse.

  1. Création du contrôleur Étant donné que l'écran lors du démarrage de l'application est omis cette fois, veuillez régler pour afficher chaque fragment en ajoutant deux boutons à l'activité racine.

L'adresse et le nom saisis sont reçus par EditText et la valeur est transmise à AlertDialog via Bundle. Et lorsque le bouton positif de AlertDialog est pressé, si la valeur de l'adresse saisie existe déjà sur la table, le nom est mis à jour (Update), et s'il n'existe pas, un nouvel enregistrement (Insert) est effectué. .. Je suis surpris que ceux-ci soient atteints en une seule ligne de la méthode de Realm copyToRealmOrUpdate ().

Le RecyclerView répertorie tous les enregistrements de la table Friend. Comme vous l'avez peut-être remarqué ici, Realm n'a pas besoin de récupérer à nouveau les données lorsque les enregistrements extraits de la table sont mis à jour ou supprimés. Dans ce code, l'enregistrement acquis est stocké dans une variable appelée «résultat», mais s'il y a un changement dans les données qu'il contient, les données seront synchronisées séquentiellement. C'est merveilleux. --Adaptateur personnalisé

    ```FriendAdapter.java
    class FriendAdapter extends RealmRecyclerViewAdapter<Friend, FriendAdapter.FriendViewHolder> {
      private OrderedRealmCollection<Friend> objects;
    
      FriendAdapter(OrderedRealmCollection<Friend> friends) {
        super(friends, true);
        this.objects = friends;
        setHasStableIds(true);
      }
    
      @Override
      public FriendViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_friend, parent, false);
        return new FriendViewHolder(view);
      }
    
      @Override
      public void onBindViewHolder(FriendViewHolder holder, int position) {
        final Friend obj = getItem(position);
        //noinspection ConstantConditions
        holder.name.setText(obj.getName());
        holder.address.setText(obj.getAddress());
      }
    
      @Override
      public int getItemCount() {
        return objects.size();
      }
    
      static class FriendViewHolder extends RecyclerView.ViewHolder {
        TextView name;
        TextView address;
    
        FriendViewHolder(View view) {
          super(view);
          name = view.findViewById(R.id.name_text);
          address = view.findViewById(R.id.address_text);
        }
      }
    }
    ```

C'est un peu plus rapide (plus léger) en utilisant ViewHolder. Créez votre propre adaptateur personnalisé qui hérite de RealmRecyclerViewAdapter <nom de la table, nom de l'adaptateur.Nom de ViewHolder>.

Tips Je n'ai pas publié le code pour MainActivity cette fois, mais vous devez initialiser Realm avec Activity lorsque l'application démarre. Je pense que ce n'est pas grave si vous ajoutez le code suivant.

Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(config);

Il semble qu'il existe différents paramètres de configuration, donc dans le document officiel ...

De plus, après la distribution de l'application, il y aura des demandes telles que "Je veux ajouter une nouvelle colonne!", "Je veux changer les attributs de colonne!", Et "Je veux ajouter une table en premier lieu". Realm peut gérer cela avec la fonction de migration. Cependant, s'il est encore en cours de développement et avant distribution, il est difficile de décrire la migration une par une. Par conséquent, si vous ajoutez le code suivant au moment de l'initialisation, la base de données sera supprimée une fois proprement, la migration n'est donc pas nécessaire.

Realm.deleteRealm(config);

Ceci est utile lorsque les spécifications de la base de données n'ont pas été finalisées au tout début du développement!

À la fin

Lorsque j'ai utilisé Realm, j'ai été impressionné par sa facilité d'utilisation. Il est également merveilleux que la réponse soit extrêmement rapide par rapport à d'autres plug-ins associés.

Je pense que c'est parfait pour ceux qui n'ont jamais touché à SQL et qui ont peu d'expérience. Si vous rencontrez des problèmes avec la base de données développée par Androi, n'hésitez pas à l'essayer!

Il y a des méthodes et des fonctions qui n'ont pas encore été introduites, donc dans le document officiel ... Realm Java 3.5.0

Recommended Posts

[Android] J'ai quitté SQLite et essayé d'utiliser Realm
[Android] J'ai essayé d'utiliser la disposition du coordinateur.
J'ai essayé d'utiliser Realm avec Swift UI
J'ai essayé d'utiliser Gson
J'ai essayé d'utiliser TestNG
J'ai essayé d'utiliser Galasa
J'ai essayé d'utiliser "nifty cloud mobile backend" et l'authentification "Firebase" sur Kotlin + Android
J'ai essayé d'utiliser une connexion à une base de données dans le développement Android
J'ai essayé d'utiliser YOLO v4 sur Ubuntu et ROS
J'ai essayé d'utiliser azure cloud-init
J'ai essayé d'utiliser Apache Wicket
J'ai essayé d'utiliser Java REPL
J'ai essayé un test unitaire de l'application Rails en utilisant RSpec et FactoryBot
[Android] [Bibliothèque] J'ai essayé d'utiliser une bibliothèque d'animations appelée "Before After animation".
J'ai essayé d'utiliser la bibliothèque CameraX avec Android Java Fragment
J'ai essayé d'utiliser anakia + Jing maintenant
J'ai essayé d'utiliser Spring + Mybatis + DbUnit
J'ai essayé d'utiliser JOOQ avec Gradle
J'ai essayé d'utiliser l'API Java8 Stream
J'ai essayé d'utiliser JWT en Java
J'ai essayé d'utiliser le conteneur Pari gp
J'ai essayé d'utiliser WebAssembly Stadio (version 2018/4/17)
J'ai essayé d'utiliser le mémo Java LocalDate
J'ai essayé d'utiliser Google HttpClient de Java
J'ai essayé d'intégrer parfaitement Docker et Maven / Netbean en utilisant Jib
Je voulais animer une ligne lors de l'utilisation de realm et RecyclerView sur Android, mais j'ai abandonné
J'ai essayé de créer une simple application Android de reconnaissance faciale en utilisant OpenCV
J'ai essayé d'utiliser l'API Elasticsearch en Java
J'ai essayé d'utiliser l'outil de diagnostic Java Arthas
J'ai présenté WSL2 + Ubuntu à Window10 et essayé d'utiliser GDC, DMD, LDC
J'ai essayé d'utiliser UICollectionViewListCell ajouté à partir de Xcode12.
J'ai créé et défini mon propre dialecte avec Thymeleaf et j'ai essayé de l'utiliser
J'ai essayé d'utiliser Scalar DL avec Docker
J'ai essayé de créer mon propre guide de transfert en utilisant OpenTrip Planner et GTFS
J'ai essayé d'utiliser OnlineConverter avec SpringBoot + JODConverter
C'est nouveau, mais j'ai essayé d'utiliser Groonga
J'ai essayé d'utiliser OpenCV avec Java + Tomcat
[JDBC ③] J'ai essayé d'entrer à partir de la méthode principale en utilisant des espaces réservés et des arguments.
J'ai essayé d'utiliser Junit avec Mac VScode Maven
[Pour les débutants] J'ai essayé d'utiliser DBUnit avec Eclipse
[Pour les débutants] J'ai essayé d'utiliser JUnit 5 avec Eclipse
J'ai essayé de lier grafana et postgres [docker-compose]
J'ai aussi essayé Web Assembly avec Nim et C
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
[API] J'ai essayé d'utiliser l'API de recherche par code postal
J'ai essayé de lier JavaFX et Spring Framework.
J'ai essayé d'implémenter un serveur en utilisant Netty
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai essayé d'utiliser Wercker pour créer et publier une image Docker qui lance GlassFish 5
J'ai essayé Spring.
J'ai essayé de mettre Tomcat
J'ai essayé youtubeDataApi.
J'ai essayé de refactoriser ①
J'ai essayé FizzBuzz.
J'ai essayé JHipster 5.1
Essayé l'API Toot et Streaming de Mastodon en Java
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
J'ai essayé de lire et de sortir CSV avec Outsystems