——你拼命挣钱的样子,虽然有些狼狈;但是你自己靠自己的样子,真的很美!
前言
——这篇主要是梳理一下Jetpack架构组件之一的Room,并结合楼主所学做个总结。面向那些还没接触Room的同学们。看完这篇可以快速了解它,并轻松使用。也想请教前辈们指点文章中的错误或不足的地方。本篇只描述Room,不会拓展额外的知识,若想了解更多关于Jetpack组件知识可以看楼主写的Jetpack专栏。
一、简介
(1)是什么
——Room 是google推出的Jetpack架构组件之一,在SQLite上提供了一个抽象层,允许流畅地访问数据库,同时利用SQLite的全部功能。
Room包含3个重要组件:
- Database:包含数据库容器,并作为到应用程序的持久关系数据的基础连接的主要访问点
- Entity:表示数据库中的一个表。
- DAO:包含用于访问数据库的方法
Room 不同组件之间的关系:
(2)有什么用
——这个库可以帮助你在运行应用的设备上创建应用数据的缓存。这个缓存是应用的唯一真实来源,允许用户查看应用内的关键信息的一致副本,不管用户是否有互联网连接
可以简单的理解为Room是对SQLite的一个封装,使开发者们更容易使用SQLite。
(3)有什么优点
- 通过简单的注释,room注解处理器会帮开发者生成创建数据库所需的代码。
- 使用简洁,代码量少
- 结构清晰,易于维护
二、基本使用
(1)添加依赖
implementation "android.arch.persistence.room:runtime:1.1.0"
annotationProcessor "android.arch.persistence.room:compiler:1.1.0"
(2)建立一个表
/**
* 通过@Entity 注解 建立一个表
*/
@Entity
public class Student {
@PrimaryKey(autoGenerate = true) int id;
@ColumnInfo String name;
@ColumnInfo String sex;
@ColumnInfo int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)创建数据库
/**
* 创建数据库
* 通过entities 指定数据库中的表
* version指定当前数据库版本号
*/
@Database(entities = {Student.class},version = 1)
public abstract class RoomDbManager extends RoomDatabase {
public abstract StudentDao getStudentDao();
}
(4)创建访问数据库的方法
/**
* 创建访问数据库的方法
*/
@Dao
public interface StudentDao {
@Insert
void insertOne(Student student);
@Delete
void deleteOne(Student student);
@Update
void update(Student student);
@Query("SELECT * FROM Student")
List<Student> getAll();
}
(5)使用步骤
private RoomDbManager roomDb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//步骤一:获取数据库实例
if (room_blcs == null) {
roomDb= Room.databaseBuilder(getApplicationContext(),
RoomDbManager.class, "room_blcs").build();
}
//步骤二:获取访问数据库的方法实例
StudentDao studentDao = roomDb.getStudentDao();
//步骤三:访问StudentDao 方法执行数据库操作:增删改查
//注:这些方法不能在主线程(UI线程)上执行,需要创建新的线程来执行这些耗时操作。
//增:studentDao.insertOne(student);
//删:studentDao.deleteOne(student)
//改:studentDao.update(student)
//查:List<Student> all = studentDao.getAll()
}
——通过上面例子可以简单的使用room,不过不能满足大部分情况。下面介绍常用方法
三、进阶
(1)有关表的操作
1. @Entity
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public @interface Entity {
/**
* 定义表名 默认使用类名
*/
String tableName() default "";
/**
* 定义索引
*/
Index[] indices() default {};
/**
* 声明是否继承父类索引 默认false
*/
boolean inheritSuperIndices() default false;
/**
* 定义主键
*/
String[] primaryKeys() default {};
/**
* 定义外键
*/
ForeignKey[] foreignKeys() default {};
}
——通过该注释定义一张表。每一张表必须有一个主键。Entity属性字段表示 参考上面注释
@Entity(tableName = "students",
indices = {@Index(value = {"firstName", "address"})},
inheritSuperIndices = true,
primaryKeys = {"id", "lastName"},
foreignKeys = { @ForeignKey(entity = Playlist.class,
parentColumns = "id",childColumns = "playlistId")})
public class User {
public int id;
public String firstName;
public String lastName;
public int playlistId;
}
2. @primaryKeys
——除了通过 @Entity(primaryKeys = {"firstName", "lastName"}) 声明主键外,还可以使用@PrimaryKey注解字段
@Entity
public class Student {
@PrimaryKey
int id;
...
}
——autoGenerate 可以让SQLite自动生成唯一的id, 默认为false
@PrimaryKey(autoGenerate = true)
int id;
3. @ColumnInfo
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface ColumnInfo {
/**
* 定义列名 默认为字段名
*/
String name() default INHERIT_FIELD_NAME;
String INHERIT_FIELD_NAME = "[field-name]";
/**
* 定义列的类型 默认使用 UNDEFINED
*/
@SuppressWarnings("unused") @SQLiteTypeAffinity int typeAffinity() default UNDEFINED;
/**
* 列的使用类型
*/
int UNDEFINED = 1;
int TEXT = 2;
int INTEGER = 3;
int REAL = 4;
int BLOB = 5;
@IntDef({UNDEFINED, TEXT, INTEGER, REAL, BLOB})
@interface SQLiteTypeAffinity {
}
/**
* 定义索引
*/
boolean index() default false;
/**
* 定义列的排列顺序 默认使用 UNSPECIFIED
*/
@Collate int collate() default UNSPECIFIED;
/**
* 列的排列顺序常量
*/
int UNSPECIFIED = 1;
int BINARY = 2;
int NOCASE = 3;
int RTRIM = 4;
@RequiresApi(21)
int LOCALIZED = 5;
@RequiresApi(21)
int UNICODE = 6;
@IntDef({UNSPECIFIED, BINARY, NOCASE, RTRIM, LOCALIZED, UNICODE})
@interface Collate {
}
}
——通过该属性定义表中的一个列,ColumnInfo属性字段表示 参考上面注释
@Entity
public class Student {
@PrimaryKey(autoGenerate = true)
int id;
@ColumnInfo(name = "names",typeAffinity = TEXT,ind