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

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

一、存储方式对比

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

存储方式 特点 使用场景
SharedPreferences 1、只能存boolean、int、float、long、String五种类型
2、键值对存储
记录app的各种配置信息
文件存储 1、可以存储各种格式的文件到手机中
2、默认情况下不能跨app共享
1、网络下载的zip包
2、txt文件的存储
ContentProvider 1、可跨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"

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

uid first_name last_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、所有属性必须是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);
}

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、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原理分析


版权声明:本文为CSDN博主「Curlyhairdog」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_53185556/article/details/128168899?spm=1001.2014.3001.5501

猜你喜欢

转载自blog.csdn.net/fjnu_se/article/details/128207912