[Android + Jatpack] Room + ViewModel 学习及使用记录(Java实现)

本文介绍了Android开发中使用Room数据库和ViewModel的实践过程,包括Room的依赖、Entity和Dao的定义,以及在Java中实现的注意事项。文章通过一个具体的Demo展示了如何配置ARouter,处理Room相关类代码,并探讨了在Dao中使用LiveData的问题,提出了异步数据回调的解决方案。在遇到的问题部分,作者分享了room版本、依赖冲突等常见问题及其解决方法。
摘要由CSDN通过智能技术生成

-前言

近期学习安卓(不要问为什么这么晚才开始学),接触到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就是数据库
在这里插入图片描述

userTablepageTable就是一个个数据表****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也可以,但是为了两个数据表的代码隔离, 我还是把EntityDao一一对应了)
PageEntity:同UserEntity
PageDao:同UserDao

UserViewModel:处理UserDemoActivity的ViewModel
PageViewModel:处理UserDemoActivity的ViewModel

- 关于Room的个人理解

- 举个仓储物流行业的例子
(意思大概就是这么个意思,不准确的唔要纠结…)
在这里插入图片描述

- demo展示

这里通过一个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值