当前位置:   article > 正文

Android数据存储及Room数据库的使用和原理分析_room数据库的设计和使用

room数据库的设计和使用

Android数据存储及Room数据库的使用和原理分析

一、存储方式对比

Android目前常见的数据存储方式有以下四种:

存储方式特点使用场景
SharedPreferences1、只能存boolean、int、float、long、String五种类型
2、键值对存储
记录app的各种配置信息
文件存储1、可以存储各种格式的文件到手机中
2、默认情况下不能跨app共享
1、网络下载的zip包
2、txt文件的存储
ContentProvider1、可跨App进行数据共享
2、通过uri对象进行访问
音频、视频、图片的读写
SQLite存储数据1、可存储结构化数据
2、对数据进行增删改查较为方便
保存流数据

二、Room介绍和实践案例

Room

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

Client
Room
SupportSQLiteOpenHelper

主要三个组件

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

Room的接入

1.Gradle目录的build.gradle文件dependencies里添加如下:

implementation "androidx.room:room-common:2.4.2"
implementation "androidx.room:room-compiler:2.4.3"
  • 1
  • 2

2、数据库设计,下面假设设计一个表,表名为user,数据表包含uid,first_name,last_name 3个字段

uidfirst_namelast_name
1
2
3
4

3、新建Entity:定义一个User数据实体,User的每个实例都代表App数据库中的user表的一行

@Entity
public class User {
    @PrimaryKey(autoGenerate = true)
    private Integer id;
    @ColumnInfo(name="first_name")
    private String firstName;
    @ColumnInfo(name="last_name")
    private String lastName;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注意事项:
1、所有属性必须是public、或者有get、set方法
2、@PrimaryKey:表示单个主键、当主键为null且autoGenerate为true时可以帮助生成键值
3、@ColumInfo:列名的注解

4、新增DAO:定义一个名为UserDao的DAO。用来对User表进行增删改查

@Dao
public interface UserDao {
    @Query("select * from user")
    List<User> getAll();

    @Insert
    void insert(User user);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5、新建数据库类,进行数据库配置,并需满足以下四个条件:

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

6、获取DAO对象,即可对数据库进行增删改查

AppDateBase db = Room.databaseBuilder(this, AppDateBase.class, "database-name")
                .allowMainThreadQueries()
                .build();
        UserDao userDao = db.userDao();

/*        User user1 = new User(1,"张","某");
        User user2 = new User(2,"李","某");
        User user3 = new User(3,"刘","某");
        User user4 = new User(4,"谢","某");
        userDao.insert(user1);
        userDao.insert(user2);
        userDao.insert(user3);
        userDao.insert(user4);*/

        List<User> all = userDao.getAll();
        for(User user:all){
            System.out.println(user);
        }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

原理介绍

1、Room在编译期,会处理@Dao和@DataBase注解,生成DAO和Database的实现类Impl
AppDatabase_Impl:数据库实例的具体实现,自动生成,主要有以下几个方法

  • createOpenHelper():Room.databaseBuilder().build()创建Database时,会调用实现类的createOpenHelper()创建SupportSQliteOpenHelper,此Helper用来创建DB及管理版本。
  • userDao():创建UserDao_Impl
  • UserDao_Impl:主要以以下3个成员变量以及UserDao里定义的接口

__db:RoomDatabase的实例
__insertionAdapterOfUser:EntityInsertionAdapterd实例,用于数据insert
__deletionAdapterOfUser:EntityDeletionOrUpdateAdapter实例,用于数据的update/delete

具体说明:
例如UserDao_Impl#insertAll(),会首先使用__db开启事务,再使用__insertionAdapterOfUser执行插入操作。


以上内容参考自Android Room持久库以及他人文章jetpack组件之Room原理分析

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/785660
推荐阅读
相关标签
  

闽ICP备14008679号