-前言
近期学习安卓(不要问为什么这么晚才开始学),接触到Room,为了熟悉以及备忘,在此记录一下
- 参考贴整理
1.Room官方文档
2.compileSdkVersion、buildToolsVersion、minSdkVersion与targetSdkVersion的关系
3.java中impl作用
4.Android Framework | 消息机制的冷门知识点
Room简介
- 关于Room
网上帖子太多,官网也有,我这边不展开讲,略微提一下
1. Room的依赖
我用的是java实现, 所以kapt / ksp 我都不依赖,
同时要注意,2.4.3
版本以后使用的kotlin,如果要用Java实现,只能把版本降到2.4.3
才能使用@Entity
,@Dao
等注解
(我是这么理解的,不对请指正)
dependencies {
// def room_version = "2.5.1"
def room_version = "2.4.3"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// To use Kotlin annotation processing tool (kapt)
//kapt "androidx.room:room-compiler:$room_version"
// To use Kotlin Symbol Processing (KSP)
//ksp "androidx.room:room-compiler:$room_version"
}
2.Entity
可以理解为数据类,定义了数据类型, 但是其实他是数据表中
行
的意思
@Entity(tableName = "userTable")
public class UserEntity {
// 主键,且自动分配
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "user_id")
public int userId;
@ColumnInfo(name = "user_name")
public String userName;
@ColumnInfo(name = "nick_name")
public String nickName;
@ColumnInfo(name = "user_age")
public String userAge;
}
如图↓↓↓↓
可以看到,文档中
AppDatabase
就是数据库
userTable
和pageTable
就是一个个数据表
****Entiry
即一行行插入的数据的模板类(每一个Entity
的属性,都可以理解为一个列 column
)
3.Dao
官网是这么说的:
您可以通过定义数据访问对象 (DAO) 与存储的数据进行交互。每个 DAO 都包含一些方法,这些方法提供对应用数据库的抽象访问权限。在编译时,Room 会自动为您定义的 DAO 生成实现。
通过使用 DAO(而不是查询构建器或直接查询)来访问应用的数据库,您可以使关注点保持分离,这是一项关键的架构原则。DAO 还可让您在测试应用时更轻松地模拟数据库访问。
您可以将每个 DAO 定义为一个接口或一个抽象类。对于基本用例,您通常应使用接口。无论是哪种情况,您都必须始终使用 @Dao 为您的 DAO 添加注解。DAO 不具有属性,但它们定义了一个或多个方法,可用于与应用数据库中的数据进行交互。
看的人云里雾里的…
(Dao的具体写法可以去官网查询,这里也不展开说了…)
其实这不重要,我理解的是,关于
Dao
, 以先用为主,反正是接口+注解去定义,按要求写就行了
我们要做的是,整体框架级别的理解,更强大的功能可以先绕过
@Dao
public interface UserDao {
// 插入一个/多个数据行
@Insert
public void insertUsers(UserEntity... userEntities);
// 删除一个/多个数据行
@Delete
public void deleteUsers(UserEntity... userEntities);
// 更新某个/多个数据航
@Update
public void updateUsers(UserEntity... userEntities);
//从 userTable表中查询所有
@Query("select * from userTable")
public LiveData<List<UserEntity>> queryAll();
// 未了方便和ViewModel绑定, 这里使用liveData接收
}
这里有个@Query(select * from userTable)
这里的userTable
就是UserEntity
类中的它:
这个记住别写错就好
(简单的科普到此为止…下面是实操阶段
…)
实操部分
这里先介绍几个关键的类
的名字,在dmoe实践中会提到,这里列举一下
AppDatabase
整个Demo(App)的数据库(单例模式)
他用于通过注解@Database
注解来挂在各种Entity, 并且提供Dao的抽象方法
demo中他将存在于AppRepository
中
AppRepository
整个Demo(App)的数据库的仓库管理类
,是对各类Dao的封装(比如对Dao的异步处理等)。
可以理解为AppRepository
是能够直接被Acitivity/Fragmen/ViewModel
等直接使用的
AppRepository
持有AppDatabase
单例,AppRepository
通过AppDatabase
单例,持有各个Dao
接口,可以各个Dao
接口来处理增删改查各项功能函数.
UserEntity
:定义了userTable的一些列数据类型
UserDao
:定义了对userTable数据表的专属Dao接口 (其实搞一个全局的AppDao
也可以,但是为了两个数据表的代码隔离, 我还是把Entity
和Dao
一一对应了)
PageEntity
:同UserEntity
PageDao
:同UserDao
UserViewModel
:处理UserDemoActivity的ViewModel
PageViewModel
:处理UserDemoActivity的ViewModel
- 关于Room的个人理解
- 举个仓储物流行业的例子
(意思大概就是这么个意思,不准确的唔要纠结…)
- demo展示
这里通过一个Demo来演示,写的过程也是加深学习的过程,毕竟遇到各种问题都是实际开发中会遇到的.
- demo 工程结构
其中用到了ARouter
,布局用的是ConstraintLayout
, 也用到了ViewBinding
等
看工程目录结构,其实逻辑不复杂,但是写Demo的好处就是你会遇到各种坑,然后踩,然后恍然大悟…
- demo的搭建细节记录
(插个题外话,这边记录一下空项目搭建起来的一些细节,方便以后翻阅...可以跳过不看)
- 配置ARouter(build.gradle)
android {
...
defaultConfig {
...
// 配置ARouter
javaCompileOptions {
annotationProcessorOptions {
arguments = [
AROUTER_MODULE_NAME: project.getName(),
]
}
}
}
// 开启dataBinding
dataBinding {
enabled true
}
// 开启viewBinding
viewBinding {
enabled true
}
}
dependencies {
// 配置Room
def room_version = "2.4.3" // 2.5.0版本用kotlin, 本项目无法使用 , 只能降级版本2.4.3
// def room_version = "2.5.0"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
// 配置ARouter
implementation 'com.alibaba:arouter-api:1.5.2'
annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
}
- 配置ARouter(MainApplication)
自定义的 MainApplication
public class MainApplication extends Application {
public static MainApplication mainApplication;
public static MainApplication getMainApplication() {
return mainApplication;
}
@Override
public void onCreate() {
super.onCreate();
// 单例话 mainApplication ,这里由于系统机制,其实 this 就是单例化的 pplication
mainApplication = this