这是我参与「第四届青训营 」笔记创作活动的的第7天
一、前言
今天学习到的是Android的数据存储部分,根据学习资料中的内容,数据储存以ROOM数据库为例,对于这一部分的知识的掌握,以自己的一个写的NotesAPP为例,巩固本节课知识点。
今日份的边学边练中,数据存储以本文的学习(ROOM数据库),拿我自己之前写的NotesAPP做例子:
实现效果如图所示:
核心代码与注释在文章中会有说明;
二、本节课知识点大纲:
1. Android 数据存储
2.Room数据库的使用
1.1 存储方式对比
1.2 数据库开源框架对比
2.Room数据库的使用
2.1 Room原理介绍
三、Android 数据存储:
存储方式对比
持久性的本地数据存储是Android中常见的能力,可以在应用被杀死的情况下,而保持数据不会被清除
数据库开源框架对比
Room数据库的使用
Room是 Google Jetpack 家族里的一员,Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库
主要的3个组件
- 数据库类(
Database),用于保存数据库并作为应用持久性数据底层连接的主要访问点。
- 数据实体(
Entity),用于表示应用的数据库中的表。
- 数据访问对象(
DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
基于Room数据库的Notes笔记APP实现
Room接入
新建Entity
新增DAO
新建数据库类
进行数据库配置,并需满足以下几个条件:
- 新增一个
RoomDatabase的abstract子类
- 子类需加注解
@Database(entities = [xxx], version = n),entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
- 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例
获取dao对象
package com.bigboss.notes.listeners;
import com.bigboss.notes.entities.Note;
public interface NotesListener {
void onNoteClicked(Note note,int position);
}
实现效果如下:
Room原理介绍
核心
- 编译期,通过kapt处理
@``Dao、@Database注解,动态生成对应的实现类
- 底层使用Android提供的
SupportSQLiteOpenHelper实现数据库的增删改查等操作
\
2.5.1 kapt注解处理
Room在编译期,通过kapt处理@Dao和@Database注解,生成DAO和Database的实现类 AppDatabase --> AppDatabase_Impl UserDao-->UserDao_Impl
BuildConfig生成的代码在build/generated/source/buildConfig/
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.bigboss.notes;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.bigboss.notes";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
四、课外补充:
ROOM数据库用法介绍
room 数据库有三个比较重要的部分
- @Database:定义一个数据库, 同时必须使用entities属性定义包含哪些表;使用version属性表示数据库的版本号,用于数据库升级使用;同时对于Dao的实例化也是定义在@Database所注解的class内
- @Dao:定义操作数据库表的各种api(比如:对表的增删改查)
- @Entity(实体类):定义一个table,实体类的每个属性 表示table的每个字段, 除非你用@Ignore 注解
@Database 注解定义一个数据库
- 定义一个抽象类继承RoomDatabase
- 使用@Database注解这个抽象类,同时使用entities属性配置表,version配置版本号
- 定义一系列的Dao层的抽象方法
@Dao 注解定义一个数据库
- 定义一个接口或抽象类,并使用@Dao注解这个类
- 定义各种操作表的抽象方法,并使用@Query等注解对应的抽象方法
然后build后,会自动生成 继承 UserDao 的 UserDao_Impl 类,并自动实现所有的抽象方法
@Entity注解定义table
@Entity(tableName = "tab_user")
data class User(
@ColumnInfo(name = "uid") // 定义列的名字
@PrimaryKey(autoGenerate = true) // 标示主键,并自增长
var uid: Long?,
@ColumnInfo // 如果没有指定列的名字,则使用字段名称
var username: String?,
// @ColumnInfo 是非必须的,room 默认会将所有class的所有字段定义table的列
var age: Int = 0
)
定义联合主键
如果你需要使用多个字段一起当作主键,则需要使用@Entity注解中的primaryKeys属性定义联合主键
五、引用参考:
课外补充引用:
文章学习来源:
- 【Android 客户端专场 学习资料 二】第四届字节跳动青训营(第二节:数据存储)
感谢以上作者的文章,今天的学习收获满满!!Thanks and HappyCoding!