赞
踩
Room持久性库提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问,利用SQlite的全部功能。
Room架构图
首先实现一个实例,有一个大概的了解,其次分模块学习。
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
@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); }
数据库(Database)
数据库类必须满足以下条件:
@Database
注解,该注解包含列出所有与数据库关联的数据实体的 entities 数组。RoomDatabase
。以下代码定义了用于保存数据库的 AppDatabase
类。 AppDatabase 定义数据库配置,并作为应用对持久性数据的主要访问点。
数的抽象方法,并返回 DAO 类的实例。
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
//使用 AppDatabase 中的抽象方法获取 DAO 的实例
//使用 DAO 实例中的方法与数据库进行交互
UserDao userDao = db.userDao();
List<User> users = userDao.getAll();
@Entity
注解的类。Room 实体包含数据库中相应表中的每一列的字段,包括构成主键的一个或多个列。以下代码是一个简单实体的示例,定义了一个 User 表,其中包含 ID 列、名字列和姓氏列:
@Entity
public class User {
@PrimaryKey
public int uid;
public String firstName;
public String lastName;
}
注意:要保留某个字段,Room 必须拥有该字段的访问权限。您可以通过将某个字段设为公开或为其提供 getter 和 setter 方法,确保 Room 能够访问该字段。
默认情况下,Room 将类名称用作数据库表名称。如果您希望表具有不同的名称,请设置 @Entity
注解的 tableName 属性。同样,Room 默认使用字段名称作为数据库中的列名称。如果您希望列具有不同的名称,请将 @ColumnInfo
注解添加到该字段并设置 name 属性。
//使用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; } }
注意:SQLite中的表和列都不区分大小写。
每个 Room 实体都必须定义一个主键,用于唯一标识相应数据库表中的每一行。执行此操作的最直接方式是使用 @PrimaryKey
为单个列添加注解:
@NonNull //主键不能为空,必须添加该注解
@PrimaryKey(autoGenerate = false)//设置为true,让SQlite生成唯一的ID(即添加一个主键)
public int id;
注意:如果您需要 Room 为实体实例分配自动 ID,请将 @PrimaryKey
的 autoGenerate 属性设为 true。
通过列出 @Entity
的 primaryKeys 属性中的以下列定义一个复合主键:
@Entity(primaryKeys = {"firstName", "lastName"})
public class User {
public String firstName;
public String lastName;
}
默认情况下,Room 会为实体中定义的每个字段创建一个列。 如果某个实体中有不想保留的字段,则可以使用 @Ignore
为这些字段添加注解。
@Entity
public class User {
@PrimaryKey
public int id;
public String firstName;
public String lastName;
@Ignore
public String Name;
//该字段将被忽略
当您使用 Room 持久性库存储应用的数据时,您可以通过定义数据访问对象 (DAO) 与存储的数据进行交互。每个 DAO 都包含一些方法,这些方法提供对应用数据库的抽象访问权限。在编译时,Room 会自动为您定义的 DAO 生成实现。
将每个 DAO 定义为一个接口或一个抽象类,但通常应使用接口。无论是哪种情况,都必须始终使用 @Dao
添加注解。DAO 不具有属性,但它们定义了一个或多个方法,可用于与应用数据库中的数据进行交互。
有两种类型的 DAO 方法可以定义数据库交互:
@Insert
注释,将其参数插入到数据库中的相应表中的方法。@Insert
方法的每个参数必须是带有@Entity
注解实体类的实例或数据实体类的集合。@Insert
方法接收单个参数,则会返回long
值,这是插入项的新 rowId
。long
值组成的数组或集合,并且每个值都作为其中一个插入项的 rowId
。@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);
}
@Update
/ @Delete
注释,定义更新数据库表中特定行的方法。@Update
/ @Delete
方法可以选择性的返回 int 值,该值指示成功更新的行数。@Dao
public interface UserDao {
//更新
@Update
public void updateUsers(User... users);
//删除
@Delete
public void deleteUsers(User... users);
}
使用 @Query
注解,您可以编写 SQL 语句并将其作为 DAO 方法公开。使用这些查询方法从应用的数据库查询数据,或者需要执行更复杂的插入、更新和删除操作。
Room 会在编译时验证 SQL 查询。这意味着,如果查询出现问题,则会出现编译错误,而不是运行时失败。
//使用简单的 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();
https://github.com/Mike-Shake/Demo_zujian/tree/master/room_demo2
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。