Android Jetpack架构组件之Room入门及源码分析

 

——你拼命挣钱的样子,虽然有些狼狈;但是你自己靠自己的样子,真的很美!

前言

一、简介

(1)是什么

(2)有什么用

(3)有什么优点

​二、基本使用

三、进阶

四、源码分析

五、内容推荐

六、项目参考


前言

——这篇主要是梳理一下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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值