Android 数据存储 | 青训营笔记

130 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的的第7天

一、前言

今天学习到的是Android的数据存储部分,根据学习资料中的内容,数据储存以ROOM数据库为例,对于这一部分的知识的掌握,以自己的一个写的NotesAPP为例,巩固本节课知识点。

今日份的边学边练中,数据存储以本文的学习(ROOM数据库),拿我自己之前写的NotesAPP做例子:

实现效果如图所示:

image.png

截屏2022-07-29 14.49.27.png

核心代码与注释在文章中会有说明;

二、本节课知识点大纲:

1. Android 数据存储

2.Room数据库的使用

1.1 存储方式对比

1.2 数据库开源框架对比

2.Room数据库的使用

2.1 Room原理介绍

三、Android 数据存储:

存储方式对比

持久性的本地数据存储是Android中常见的能力,可以在应用被杀死的情况下,而保持数据不会被清除

image.png

数据库开源框架对比

image.png

Room数据库的使用

Room是 Google Jetpack 家族里的一员,Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库

主要的3个组件

  • 数据库类(Database),用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  • 数据实体(Entity),用于表示应用的数据库中的表。
  • 数据访问对象(DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。

基于Room数据库的Notes笔记APP实现

Room接入

截屏2022-07-29 15.01.48.png

新建Entity

截屏2022-07-29 15.04.34.png

新增DAO

截屏2022-07-29 15.05.07.png

新建数据库类

进行数据库配置,并需满足以下几个条件:

  • 新增一个RoomDatabaseabstract子类
  • 子类需加注解@Database(entities = [xxx], version = n)entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
  • 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例

截屏2022-07-29 15.05.35.png

获取dao对象

package com.bigboss.notes.listeners;

import com.bigboss.notes.entities.Note;

public interface NotesListener {
    void onNoteClicked(Note note,int position);
}

实现效果如下: image.png

截屏2022-07-29 14.49.27.png

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/

截屏2022-07-29 15.09.34.png

/**
 * 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属性定义联合主键

五、引用参考:

课外补充引用:

文章学习来源:

感谢以上作者的文章,今天的学习收获满满!!Thanks and HappyCoding!