Android——Aprendizaje en sala de Jetpack (implementación de Java con demostración)

¿Qué es la habitación?

  1. Room es un marco de base de datos lanzado por Goole y pertenece a la biblioteca ORM.
    ORM (Mapeo Relacional de Objetos) también se llamaMapeo relacional de objetos. En pocas palabras, el lenguaje de programación que utilizamos es un lenguaje orientado a objetos y la base de datos que utilizamos es una base de datos relacional. Se establece una relación de mapeo entre el lenguaje orientado a objetos y la base de datos relacional, que es ORM.
  2. Room es una base de datos persistente.

La biblioteca de persistencia Room proporciona una capa de abstracción sobre SQLite para permitir un acceso fluido a la base de datos mientras se aprovecha al máximo SQLite, aprovechando todo el poder de SQlite.

  • ventaja
    • Las consultas SQL se validan en tiempo de compilación : cada @Query y @Entity, etc. se verifican en tiempo de compilación, lo que significa que no hay riesgo de errores de tiempo de ejecución que puedan bloquear la aplicación (y no solo verifica si hay problemas de sintaxis, también verifica si la mesa existe)
    • menos código repetitivo
    • Integración con LiveData
    • La combinación con Rxjava puede monitorear los cambios de datos en tiempo real

Componente de la habitación

  • Entidad : entidad de datos, correspondiente a la tabla en la base de datos.
  • DAO : Objetos de acceso a datos que proporcionan métodos para consultar, actualizar, insertar y eliminar datos en la base de datos.
  • Base de datos : se utiliza para contener la base de datos y servir como punto de acceso principal para la conexión subyacente a los datos persistentes de la aplicación.

Diagrama de arquitectura de la habitación.
inserte la descripción de la imagen aquí

Proceso de implementación

Primero implemente un ejemplo, tenga una comprensión general y luego aprenda en módulos.

  1. La entidad de datos (Entidad)
    define una entidad de datos de Usuario. Cada instancia de Usuario representa una fila en la tabla de usuarios en la base de datos de la aplicación.
@Entity
public class User {
    
    
    @PrimaryKey
    public int uid;

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

    @ColumnInfo(name = "last_name")
    public String lastName;
}
  1. Los objetos de acceso a datos (DAO)
    definen un DAO llamado UserDao. UserDao proporciona métodos que el resto de la aplicación utiliza para interactuar con los datos en la tabla de usuarios.
@Dao
public interface UserDao {
    
    
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
           "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}
  1. Base de datos

    La clase de base de datos debe cumplir las siguientes condiciones:

    • La clase debe estar @Databaseanotada con una matriz de entidades que enumere todas las entidades de datos asociadas con la base de datos.
    • La clase debe ser una clase abstracta para la extensión RoomDatabase.
    • Para cada clase DAO asociada con una base de datos, la clase de base de datos debe definir un

El siguiente código define AppDatabasela clase utilizada para guardar la base de datos. AppDatabase define la configuración de la base de datos y sirve como punto de acceso principal de la aplicación a los datos persistentes.
Método abstracto para números y devuelve una instancia de la clase DAO.

@Database(entities = {
    
    User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    
    
    public abstract UserDao userDao();
}
  1. Uso
    Después de definir entidades de datos, DAO y objetos de base de datos , cree una instancia de base de datos:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
                    AppDatabase.class, "database-name").build();
//使用 AppDatabase 中的抽象方法获取 DAO 的实例
//使用 DAO 实例中的方法与数据库进行交互
UserDao userDao = db.userDao();
List<User> users = userDao.getAll();

Definir datos usando entidades de habitación

Entidad detallada

  1. Puede definir cada entidad Room como una clase @Entityanotada . La entidad Room contiene campos para cada columna de la tabla correspondiente en la base de datos, incluidas una o más columnas que conforman la clave principal .

El siguiente código es un ejemplo de una entidad simple, que define una tabla de Usuario con columnas para ID, Nombre y Apellido:

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

    public String firstName;

    public String lastName;
}

Nota: Para conservar un campo, Room debe tener acceso a ese campo. Puede hacer que un campo sea accesible para Room haciéndolo público o proporcionándole métodos getter y setter.

por defecto,La sala usa nombres de clases como nombres de tablas de bases de datos. Si desea que la tabla tenga un nombre diferente, establezca @Entityel atributo tableName de la anotación. mismo,La sala utiliza de forma predeterminada nombres de campos como nombres de columnas en la base de datos. Si desea que la columna tenga un nombre diferente, @ColumnInfoagregue una anotación al campo y establezca el atributo de nombre.

//使用Entity注解的tableName属性:更改数据库表的名称
@Entity(tableName = "users")
public class User {
    
    
    @PrimaryKey
    public int id;

    //使用ColumnInfo提供的name属性:更改数据库中的列名称
    @ColumnInfo(name = "first_name")
    public String firstName;

    @ColumnInfo(name = "last_name")
    public String lastName;
    
    //实现getter,setter方法
    public int getUid() {
    
    
    return uid;
    }
    
    public void setUid(int uid) {
    
    
        this.uid = uid;
    }
    
    public String getFirstname() {
    
    
        return firstname;
    }
    
    public void setFirstname(String firstname) {
    
    
        this.firstname = firstname;
    }
    
    public String getLastname() {
    
    
        return lastname;
    }
    
    public void setLastname(String lastname) {
    
    
        this.lastname = lastname;
    }
}

Nota: Las tablas y columnas en SQLite no distinguen entre mayúsculas y minúsculas.

definir clave primaria

Cada entidad Room debe definir una clave principal que identifique de forma única cada fila en la tabla de base de datos correspondiente. La forma más sencilla de hacerlo es @PrimaryKeyanotar columnas individuales usando:

@NonNull      //主键不能为空,必须添加该注解
@PrimaryKey(autoGenerate = false)//设置为true,让SQlite生成唯一的ID(即添加一个主键)
public int id;

Nota: Si desea que Room asigne ID automáticos a instancias de entidad, @PrimaryKeyestablezca la propiedad autoGenerate en verdadero.

Definir una clave primaria compuesta

@EntityDefina una clave primaria compuesta enumerando las siguientes columnas en la propiedad PrimaryKeys de:

@Entity(primaryKeys = {
    
    "firstName", "lastName"})
public class User {
    
    
    public String firstName;
    public String lastName;
}

ignorar campo

De forma predeterminada, Room crea una columna para cada campo definido en la entidad. Si hay campos en una entidad que no desea conservar, puede utilizarlos @Ignorepara anotar esos campos .

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

    public String firstName;
    public String lastName;

    @Ignore
    public String Name;
    //该字段将被忽略

Acceda a los datos utilizando Room DAO

Cuando utiliza la biblioteca de persistencia de Room para almacenar los datos de su aplicación, puede interactuar con los datos almacenados definiendo objetos de acceso a datos (DAO) . Cada DAO contiene métodos que proporcionan acceso abstracto a la base de datos de la aplicación. En el momento de la compilación, Room genera automáticamente implementaciones para los DAO que defina.
Defina cada DAO como una interfaz o una clase abstracta, pero generalmente debería usar interfaces . En cualquier caso, @Daolas anotaciones siempre deben agregarse usando . Los DAO no tienen propiedades, pero definen uno o más métodos que se pueden usar para interactuar con datos en la base de datos de la aplicación.

Hay dos tipos de métodos DAO que definen las interacciones de la base de datos:

  • Método conveniente para insertar, actualizar y eliminar filas en una base de datos sin escribir ningún código SQL.
  • Método de consulta para escribir sus propias consultas SQL para interactuar con la base de datos.

Método conveniente sin escribir código SQL

  1. Insertar Un método que inserta sus parámetros en la tabla correspondiente en la base de datos
    con la ayuda de la anotación. a. Cada parámetro del método debe ser una instancia de una clase de entidad anotada o una colección de clases de entidad de datos. b. Cuando se llama al método, Room insertará cada instancia de entidad pasada en la tabla de base de datos correspondiente. c.Si el método recibe un solo parámetro, devuelve el valor, que es el nuevo valor del elemento insertado . d. Si el argumento es una matriz o una colección, el método debería devolver una matriz o una colección de valores con cada valor como uno de los elementos insertados .@Insert
    @Insert@Entity

    @InsertlongrowId
    longrowId
@Dao
public interface UserDao {
    
    
    //实现一个或多个User对象插入数据库
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    public void insertUsers(User... users);

    @Insert
    public void insertBothUsers(User user1, User user2);

    @Insert
    public void insertUsersAndFriends(User user, List<User> friends);
}
  1. ACTUALIZAR/ELIMINAR
    Con la ayuda de las anotaciones @Update/ @Delete, defina métodos para actualizar filas específicas en una tabla de base de datos.
    a. Room hace coincidir la instancia de entidad pasada con una fila en la base de datos usando la clave principal. Room no realizará ningún cambio si no hay una fila con la misma clave principal.
    b. El método @Update/ @Deletepuede opcionalmente devolver un valor int que indica el número de filas actualizadas correctamente.
@Dao
public interface UserDao {
    
    
    //更新
    @Update
    public void updateUsers(User... users);
    //删除
    @Delete
    public void deleteUsers(User... users);
}

Método de consulta para escribir código SQL

Usando @Queryanotaciones, puede escribir sentencias SQL y exponerlas como métodos DAO. Utilice estos métodos de consulta para consultar datos de la base de datos de su aplicación o si necesita realizar operaciones de inserción, actualización y eliminación más complejas.
Room valida las consultas SQL en tiempo de compilación. Esto significa que si algo sale mal con la consulta, habrá un error de compilación en lugar de un error de ejecución.

  • El formato de uso de Room para escribir condiciones de consulta de referencia SQL es " nombre de campo =: valor de referencia "
//使用简单的 SELECT 查询返回数据库中的所有 User 对象:
//SQLite中的表和列都不区分大小写。
@Query("SELECT * FROM user")
public User[] loadAllUsers();

//查询指定first_name的数据
@Query("SELECT * FROM user where first_name =: name")
 public User loadUsers_first();
 
 //查询指定last_name的数据
@Query("SELECT * FROM user where last_name =: name")
 public User loadUsers_last();
 
 
//删除所有 User 对象:
@Query("DELETE * FROM user")
public void deleteAllUsers();

//删除指定first_name的数据
@Query("DELETE * FROM user where first_name =: name")
public void loadUsers_first();

dirección de demostración

https://github.com/Mike-Shake/Demo_zujian/tree/master/room_demo2

Supongo que te gusta

Origin blog.csdn.net/The_onion/article/details/128066517
Recomendado
Clasificación