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的强大功能的同时,能够流畅地访问数据库。
主要三个组件
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