AndroidJetpack应⽤指南学习笔记4之Room的简单使⽤
1.在Android中采⽤Sqlite作为数据库存储。Sqlite代码写起来繁琐且容易出错,所以开源社区⾥逐渐出现了各种ORM(Object Relational Mapping)库。这些开源ORM库都是为了⽅便Sqlite的使⽤,包括数据库的创建,升级,增删改查等。常见的ORM有
ORMLite,GreenDAO等。Google也意识到了推出⾃家ORM的必要性,于是有了Room。
2.Room 包含 3 个主要组件:
数据库:包含数据库持有者,并作为应⽤已保留的持久关系型数据的底层连接的主要接⼊点。使⽤ @Database 注释的类应满⾜以下条件:是扩展 RoomDatabase 的抽象类。在注释中添加与数据库关联的实体列表。包含具有 0 个参数且返回使⽤ @Dao 注释的类的抽象⽅法。 在运⾏时,可以通过调⽤Room.databaseBuilder()或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。
Entity:表⽰数据库中的表。
DAO:包含⽤于访问数据库的⽅法。
应⽤使⽤ Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。然后,应⽤使⽤每个 DAO 从数
据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。最后,应⽤使⽤实体来获取和设置与数据库中的表列相对应的值。
3.Room中常⽤注解说明:
@Entity:这是⼀个Model类,对应于数据库中的⼀张表。Entity类是Sqlite表结构在Java类的映射。
@Dao:(Data Access Objects)数据访问对象,顾名思义,我们可以通过它来访问数据。⼀个Entity代表着⼀张表,⽽每张表都需要⼀个Dao对象,以⽅便对这张表进⾏各种操作(增删改查)
@Database:数据库对象,⼀般写成单例模式
4.Entity中的常⽤注解:
属性:tableName:设置表名字。默认是类的名字。indices:设置索引。inheritSuperIndices:⽗类的索引是否会⾃动被当前类继承。
@foreignKeys:设置外键。
@PrimaryKey标签⽤于指定该字段作为表的主键。
@ColumnInfo标签可⽤于设置该字段存储在数据库表中的名字并指定字段的类型。
@Ignore标签⽤来告诉系统忽略该字段或者⽅法。
5.@ForeignKey属性:
entity:parent实体类(引⽤外键的表的实体)。
parentColumns:parent外键列(要引⽤的外键列)。
childColumns:child外键列(要关联的列)。
onDelete:默认NO_ACTION,当parent⾥⾯有删除操作的时候,child表可以做的Action动作有:
1. NO_ACTION:当parent中的key有变化的时候child不做任何动作。
2. RESTRICT:当parent中的key有依赖的时候禁⽌对parent做动作,做动作就会报错。
3. SET_NULL:当paren中的key有变化的时候child中依赖的key会设置为NULL。
4. SET_DEFAULT:当parent中的key有变化的时候child中依赖的key会设置为默认值。
5. CASCADE:当parent中的key有变化的时候child中依赖的key会跟着变化。
onUpdate:默认NO_ACTION,当parent⾥⾯有更新操作的时候,child表需要做的动作。Action动作⽅式和onDelete是⼀样的。
deferred:默认值false,在事务完成之前,是否应该推迟外键约束。这个怎么理解,当我们启动⼀个事务插⼊很多数据的时候,事务还没完成之前。当parent引起key变化的时候。可以设置deferred为ture。让key⽴即改变。
6.Dao中常⽤的注解:
@Query查询
@Insert插⼊
@Update更新
@Delete删除
7.@Insert注解属性onConflict:
默认值是OnConflictStrategy.ABORT,表⽰当插⼊有冲突的时候的处理策略。
OnConflictStrategy封装了Room解决冲突的相关策略:
OnConflictStrategy.REPLACE:冲突策略是取代旧数据同时继续事务。
OnConflictStrategy.ROLLBACK:冲突策略是回滚事务
OnConflictStrategy.ABORT:冲突策略是终⽌事务。
OnConflictStrategy.FAIL:冲突策略是事务失败。
OnConflictStrategy.IGNORE:冲突策略是忽略冲突。
8.Room在项⽬中的引⼊,在app的adle中加⼊room的相关依赖:
implementation ":room-runtime:2.2.5"
annotationProcessor ":room-compiler:2.2.5"
9.创建⼀个学⽣实体类,创建⼀张表
ity;
ColumnInfo;
Entity;
Ignore;
PrimaryKey;
/**
* @author: njb
* @date: 2020/8/28 0028 0:16
* @desc:
*/
@Entity(tableName = "student")
public class Student {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)
public int id;
@ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)
public String name;
@ColumnInfo(name = "age", typeAffinity = ColumnInfo.TEXT)
public String age;
/**
* Room会使⽤这个构造器来存储数据,也就是当你从表中得到Student对象时候,Room会使⽤这个构造器
*/
public Student(int id, String name, String age) {
this.id = id;
this.name = name;
this.age = age;
}
/**
* 由于Room只能识别和使⽤⼀个构造器,如果希望定义多个构造器,你可以使⽤Ignore标签,让Room忽略这个构造器    * 同样,@Ignore标签还可⽤于字段,使⽤@Ignore标签标记过的字段,Room不会持久化该字段的数据
*/
@Ignore
public Student(String name, String age) {
this.name = name;
this.age = age;
}
}
10.创建dao⽂件接⼝:
demo.db;
Dao;
Delete;
Insert;
Query;
Update;
ity.Student;
import java.util.List;
/**
* @author: njb
* @date: 2020/8/28 0028 0:17
* @desc:
*/
@Dao
public interface StudentDao {
@Insert
void insertStudent(Student student);
@Delete
void deleteStudent(Student student);
@Update
void updateStudent(Student student);
@Query("SELECT * FROM student")
List<Student> getStudentList();
@Query("SELECT * FROM student WHERE id = :id")
Student getStudentById(int id);
}
11.定义好Dao和实体类后,创建数据库:
demo.db;
t.Context;
Database;
Room;
RoomDatabase;
ity.Student;
/**
* @author: njb
* @date: 2020/8/28 0028 0:19
* @desc:
*/
@Database(entities = {Student.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {
private static final String DATABASE_NAME = "student_db";
private static MyDatabase databaseInstance;
public static synchronized MyDatabase getInstance(Context context) {
if (databaseInstance == null) {
databaseInstance = Room
.ApplicationContext(), MyDatabase.class, DATABASE_NAME)                    .build();
}
alertdialog使用方法return databaseInstance;
}
public abstract StudentDao studentDao();
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。