3.5 Room
Room是谷歌官方推出的数据库框架,该框架基于SQLite,通过注解的方式简化了数据库操作
3.5.1 依赖
implementation 'androidx.room:room-runtime:2.2.5'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
3.5.2 Room的使用步骤
- 编写数据表对应的实体类,该类添加“@Entity”注解。
- 编写数据表对应的持久化类,该类添加“@Dao”注解。
- 编写数据表对应的数据库类,该类从RoomDatabase派生而来,并添加“@Database”注解。
- 在自定义的Application类中声明数据库的唯一实例。
- 在操作数据表的地方获取数据表的持久化对象。
实体类代码
@Entity
public class Person {
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private int price;
//自动生成setter and getter tostring
}
DAO层代码
@Dao
public interface PersonDao {
//这是一个接口,会自动生成实现类
@Insert
void insert(Person person);
@Delete
void delete();
@Update
void update();
//from后边跟的是对应的实体类名Entity
@Query("select * from Person")
List<Person> query();
//冒号id方法传入的参数
@Query("select * from Person where id = :id")
Person getPersonById(int id);
}
数据库类对应代码
//参数分别为:数据库中的表,数据库版本,自动生成建表语句到文档中
//exportSchema = true时需要指定文档的生成路径
@Database(entities = {Person.class}, version = 1, exportSchema = true)
public abstract class MyDatabase extends RoomDatabase {
public abstract PersonDao getPersonDao();
}
指定文档生成路径,在build.gradle中
defaultConfig {
...
javaCompileOptions{
annotationProcessorOptions {
arguments = ["room.schemaLocation" : "$projectDir/schemas".toString()]
}
}
}
在Application中实例化对象,oncreate中实例化,定义为成员变量
MyDatabase person_table = Room.databaseBuilder(this, MyDatabase.class, "person_table")
//允许迁移数据库,数据库发生变更时,默认是删除然后重新创建,允许迁移就可以保留之前的数据
.addMigrations()
.build();
//获取DAO对象操作数据库
person_table.getPersonDao().insert(new Person());