[Android / Java] Exploitez une base de données locale dans la salle

environnement

De base

--Créez une classe d'entité avec @ Entity. --Créez une classe qui manipule les entités avec @ Dao. --Créez une classe qui hérite de RoomDatabase et enregistrez la classe avec @ Dao comme membre. --Opérer une classe qui hérite de RoomDatabase de l'application

Notez que les classes qui héritent de RoomDatabase ne peuvent pas être utilisées sur le thread principal.

Exemple de classe @ Entity

@Entity(indices = {@Index(value = {"name"}, unique = true)})
public class User {
	@PrimaryKey
	public long id;

	@ColumnInfo
	public String name;
}

Exemple de classe @ Dao

@Dao
public abstract class UserDao {
	@Query("select id from user order by id desc limit 1")
	public abstract long getMaxId();

	@Insert(onConflict = OnConflictStrategy.IGNORE)
	abstract void insert(User user);

	@Query("delete from user where id = :id")
	abstract void delete(long id);
}

Exemple de classe d'héritage RoomDatabase

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
	public abstract UserDao userDao();
}

Exemple de classe Singleton qui crée une instance de base de données

public class AppDatabaseSingleton {
	private static AppDatabase instance = null;
	private AppDatabaseSingleton() {}

	public static AppDatabase getInstance(Context context) {
		if (instance != null) {
			return instance;
		}
		instance =  Room.databaseBuilder(context,
				AppDatabase.class, "app_database").build();
		return instance;
	}
}

Exemple d'opération de base de données

new Thread(new Runnable() {
	@Override
	public void run() {
		AppDatabase db = AppDatabaseSingleton.getInstance(context);
		long maxId = db.UserDao().getMaxId();
		callback.onComplete(maxId);
	}
}).start();

Spécifiez le nom de la table

Écrivez dans @ Entity comme (tableName = {" table name "). Si vous ne le spécifiez pas, une table sera créée avec le même nom que le nom du modèle, il est donc préférable de le spécifier si possible.

@Entity(tableName = "users")
public class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Créez une colonne que vous souhaitez avoir dans votre modèle mais pas dans votre base de données

Écrivez «@ Ignore» avant le nom de la colonne.

@Entity
public class User {
    @PrimaryKey
    public int id;

    public String firstName;
    public String lastName;

    @Ignore
    Bitmap picture;
}

Index unique à plusieurs colonnes

Écrivez (indeces = {@Index (value = {" first column "," second column "}, unique = true)}) dans @ Entity.

@Entity(indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})
public class User {
    @PrimaryKey
    public int id;

    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
}

Je souhaite définir plusieurs éléments à la fois

Écriture séparée par des virgules

@Entity(tableName = "users",
        indices = {@Index(value = {"first_name", "last_name"},
        unique = true)})

Je veux faire quelque chose comme INSERT IGNORE

Tout d'abord, la chose fondamentale est d'émettre une requête avec @ Dao au lieu de @ Entity.

Ajoutez (onConflict = OnConflictStrategy.IGNORE) à @ Insert. Si vous souhaitez le remplacer, utilisez (onConflict = OnConflictStrategy.REPLACE).

@Dao
public interface MyDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    public void insertUsers(User... users);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertBothUsers(User user1, User user2);

    @Insert
    public void insertUsersAndFriends(User user, List<User> friends);
}

Je veux faire une transaction

Si vous voulez trader, vous devez passer de ʻinterface à ʻabstract class. Ensuite, spécifiez «@ Transaction» comme méthode cible.

@Dao
abstract class UsersDao {
    @Transaction
    public void setLoggedInUser(User loggedInUser) {
        deleteUser(loggedInUser);
        insertUser(loggedInUser);
    }

    @Query("DELETE FROM users")
    abstract void deleteUser(User user);

    @Insert
    abstract void insertUser(User user);
}

Je souhaite ajouter plus de tables et de colonnes plus tard

Augmentez la version comme dans SQLite. Si vous ne faites que le soulever, rien ne sera fait, vous devez donc écrire ce que vous devez faire. Si vous ne l'écrivez pas, vous vous fâcherez.

A migration from 1 to 2 was required but not found. Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.

Le message d'erreur vous indique gentiment ce qu'il faut faire, alors faites-le simplement. Par exemple, si vous passez à la version 3, ajoutez une table Fruit dans la version 2, et ajoutez une colonne de ʻInteger appelée pub_year à la table Book` dans la version 3, vous obtenez:

@Database(entities = {Fruit.class, Book.class}, version = 3)
public abstract class AppDatabase extends RoomDatabase {
	:
	public static AppDatabase getInstance(Context context) {
		if (instance != null) {
			return instance;
		}
		static final Migration MIGRATION_1_2 = new Migration(1, 2) {
			@Override
			public void migrate(@NonNull SupportSQLiteDatabase database) {
				database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
						+ "`name` TEXT, PRIMARY KEY(`id`))");
			}
		};
		static final Migration MIGRATION_2_3 = new Migration(2, 3) {
			@Override
			public void migrate(@NonNull SupportSQLiteDatabase database) {
				database.execSQL("ALTER TABLE Book "
						+ " ADD COLUMN pub_year INTEGER");
			}
		};
		instance =  Room.databaseBuilder(context,
				AppDatabase.class, "database-name")
				.addMigrations(MIGRATION_1_2, MIGRATION_2_3)
				.build();
		return instance;
	}
}

J'aimerais que vous décriviez bien ce domaine, mais pour le moment, il y a un sentiment de puissance humaine. Il peut être relativement facile d'utiliser le SQL de création de table, etc., car il se réfère à la salle agrandie. Par exemple, si vous avez créé une classe héritée pour RoomDatabase avec le nom de classe com.example.db.AppDatabase, ʻapp / build / generated / source / apt / debug / com / example / db / AppDatabase_Impl.java Le contenu est développé pour être produit. Voici un exemple de ʻAppDatabase_Impl`.

@SuppressWarnings({"unchecked", "deprecation"})
public final class AppDatabase_Impl extends AppDatabase {
  @Override
  protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration configuration) {
    final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(configuration, new RoomOpenHelper.Delegate(2) {
      @Override
      public void createAllTables(SupportSQLiteDatabase _db) {
        _db.execSQL("CREATE TABLE IF NOT EXISTS `Fruit` (`id` INTEGER NOT NULL, `name` TEXT, PRIMARY KEY(`id`))");
        :
      }
      :
    }
  }
}

référence

Autre

La faible googleabilité de Google Comment l'appeler, que puis-je faire ...

Recommended Posts

[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
Rechercher un sous-ensemble en Java
Lire les données WAV sous forme de tableau d'octets sur Android Java
Essayez d'implémenter Android Hilt en Java
3 Implémentez un interpréteur simple en Java
J'ai créé un PDF avec Java.
Créer une base de données dans un environnement de production
Un exemple simple de rappels en Java
Restez coincé dans un Java Primer
Créez un classement temporel clair avec la base de données en temps réel de Firebase (application Android)
Comment faire fonctionner automatiquement un écran créé en Java sous Windows
Déterminer si un clavier personnalisé est activé dans Android Studio (Java)
A propos du renvoi d'une référence dans un Java Getter
Qu'est-ce qu'une classe en langage Java (3 /?)
Lors de la recherche de plusieurs dans un tableau Java
Pour créer un fichier Zip lors du regroupement des résultats de recherche de base de données en Java
[Création] Un mémorandum sur le codage en Java
Java crée un tableau dans un document Word
Java crée un graphique circulaire dans Excel
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Créer une application TODO dans Java 7 Créer un en-tête
Créons une application de calcul avec Java
Implémenter quelque chose comme une pile en Java
Diviser une chaîne avec ". (Dot)" en Java
Création d'une classe de matrice dans Java Partie 1
[Android Studio] Description qui peut être saisie en continu dans la base de données SQLite [Java]
De Java à C et de C à Java dans Android Studio
J'ai créé un programme de jugement des nombres premiers en Java
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Deux façons de démarrer un thread en Java + @
Lire une chaîne dans un fichier PDF avec Java
Une histoire sur le JDK à l'ère de Java 11
Comment afficher une page Web en Java
Mesurer la taille d'un dossier avec Java
Code pour échapper aux chaînes JSON en Java
Essayez de créer un babillard en Java
À propos de var utilisé en Java (type de variable locale)
[Java] Utilisation de final dans la déclaration de variable locale
Une note quand vous voulez Tuple en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
J'ai écrit un programme de jugement des nombres premiers en Java
Créons un framework Web ultra-simple avec Java
Supprimer tous les enregistrements d'une table dans une base de données MySQL
J'ai créé un jeu Janken en Java (CLI)
Histoire d'essayer de faire fonctionner le fichier JAVA
Un fichier bat qui utilise Java dans Windows
Conseils Java - Créez un projet Spring Boot avec Gradle
Un examen rapide de Java appris en classe
J'ai écrit un programme de factorisation prime en Java
Représente le «jour suivant» et le «jour précédent» en Java / Android
Partition en Java
Changements dans Java 11
Janken à Java
Taux circonférentiel à Java
Classe locale Java
FizzBuzz en Java
[Android / Java] Transition d'écran et traitement de retour par fragments
J'ai fait un jeu de problèmes de calcul simple en Java
Comment créer un environnement Java en seulement 3 secondes