--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.
@ Entity
@Entity(indices = {@Index(value = {"name"}, unique = true)})
public class User {
@PrimaryKey
public long id;
@ColumnInfo
public String name;
}
@ 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);
}
RoomDatabase
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
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;
}
}
new Thread(new Runnable() {
@Override
public void run() {
AppDatabase db = AppDatabaseSingleton.getInstance(context);
long maxId = db.UserDao().getMaxId();
callback.onComplete(maxId);
}
}).start();
É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;
}
É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;
}
É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;
}
Écriture séparée par des virgules
@Entity(tableName = "users",
indices = {@Index(value = {"first_name", "last_name"},
unique = true)})
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);
}
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);
}
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`))");
:
}
:
}
}
}
La faible googleabilité de Google Comment l'appeler, que puis-je faire ...