当前位置: 首页 > news >正文

Kotlin + 协程 + Room 结合使用

文章目录

  • 前言
  • 集成Room
  • 结合协程的使用
  • 总结
一、前言,

现在kotlin 是趋势,那必然就要用到协程,还有就是随着jetpack 的发力,带来了很多好用的库,比如今天提到Room,是一个类似greenDao的数据库。它不但支持kotlin协程/RxJava,还具备编译期检查,是非常友好的库。我们一起来看下,在项目中怎么使用。

二、集成Room

1、创建一个kotlin项目,然后在app里面的build.gradle添加依赖:

plugins {
...id 'kotlin-android-extensions'id 'kotlin-kapt'
}
dependencies {
...//room数据库implementation "androidx.room:room-runtime:2.4.2"kapt "androidx.room:room-compiler:2.4.2" // Kotlin 使用 kaptimplementation "androidx.room:room-ktx:2.4.2"//Coroutines support for Room 协程操作库//lifecycleimplementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0'}

此时,我们同步一下,开始运行项目。会报错:

Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8

解决:将项目的jdk1.8 改成 jdk11。
接下来还有报错:

Can't determine type for tag '<macro name="m3_comp_assist_chip_container_shape">?attr/shapeAppearanceCornerSmall</macro>'

原因是material 的版本高了的问题。

 implementation 'com.google.android.material:material:1.8.0'

解决:我们将material,改成1.6.0。项目就能正常运行了。

2、相关的类的创建

2.1创建数据库的实体类
通过在实体类上加注解@Entity,这样实体类就相当于是一张表

import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.android.parcel.Parcelize@Parcelize
@Entity(tableName = "Student")
data class Student(@PrimaryKeyvar id: String,var name: String
) : Parcelable

2.2创建实体类的Dao:
通过在Dao接口上加注解@Dao,就可以让dao轻松地完成增删改查。
另外可以将 suspend Kotlin 关键字添加到 DAO 方法中,用 Kotlin 协程功能,使这些方法成为异步方法。这样可确保不会在主线程上执行这些方法。

@Dao
interface StudentDao {//通过@Insert 注解的onConflict 解决冲突(如果有老的数据存在则会进行替换,如果没有就插入)@Insert(onConflict = OnConflictStrategy.REPLACE)suspend fun putStudent(cacheBean: Student)@Query("select * from Student where id =:id")suspend fun getStudent(id: String): Student?@Query("select * from Student")suspend fun getAllStudent(): List<Student>?@Deletesuspend fun delete(student: Student)@Update(onConflict = OnConflictStrategy.REPLACE)suspend fun update(student: Student)}

2.3 创建数据库的类
创建一个类继承RoomDatabase,加注解@Database,轻松地建数据库和建表

import android.util.Log
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.sqlite.db.SupportSQLiteDatabase//后续的数据库升级通过这个version来控制,exportSchema是否导出数据库的配置信息
@Database(entities = [Student::class], version = 2, exportSchema = false)
abstract class StudentDatabase : RoomDatabase() {companion object {var dataBase: StudentDatabaseval TAG = StudentDatabase::class.java.simpleNameinit {//如果databaseBuilder改为inMemoryDatabaseBuilder则创建一个内存数据库(进程销毁后,数据丢失)dataBase = Room.databaseBuilder(MyApplication.getApplicationContext(), StudentDatabase::class.java, "db_user")//数据库的操作是否允许在主线程中执行.allowMainThreadQueries()//数据库创建和打开后的回调,可以重写其中的方法.addCallback(object : Callback() {override fun onCreate(db: SupportSQLiteDatabase) {super.onCreate(db)Log.d(TAG, "onCreate: db_student")}})//数据库升级异常之后的回滚.fallbackToDestructiveMigration().build()}}abstract fun getStudentDao(): StudentDao

2.4 创建一个MyApplication
通过它我们来获取context。

class MyApplication : Application() {init {instance = this}companion object {private var instance: MyApplication? = nullfun getApplicationContext() : Context {return instance!!.applicationContext}}override fun onCreate() {super.onCreate()}}
三、接下来就是使用了

通过点击按钮,进行增删改查的操作。
增加数据:

    btn_add.setOnClickListener {lifecycleScope.launch {val studentDao = StudentDatabase.dataBase.getStudentDao()studentDao.putStudent(Student("101","小李"));studentDao.putStudent(Student("102","小王"))}}

更改数据:

    btn_update.setOnClickListener {lifecycleScope.launch {val studentDao = StudentDatabase.dataBase.getStudentDao()val student = studentDao.update(Student("101","小陈"))Log.d(TAG,student.toString());}}

删除数据:

    btn_delete.setOnClickListener {lifecycleScope.launch {val studentDao = StudentDatabase.dataBase.getStudentDao()val student = studentDao.delete(Student("101","小陈"))Log.d(TAG,student.toString());val students = studentDao.getAllStudent()Log.d(TAG, "students: $students")}}

查询数据:

 lifecycleScope.launch {btn_query.setOnClickListener {lifecycleScope.launch {val studentDao = StudentDatabase.dataBase.getStudentDao()val students = studentDao.getAllStudent()Log.d(TAG, "students: $students")}}

备注:数据库的操作一定要放到子线程中,切不可在主线程中操作,虽然可以通过allowMainThreadQueries强制开启允许这么做,但这个是测试时用,实际项目中还是不要在主线程中操作数据库,避免遇到ANR问题

源码地址:https://github.com/shenshizhong/KotlinRoomDemo

总结

1 、导入依赖, 同步
2 、创建一个实体类Student,加注解@Entity就相当于一张表
3 、创建一个接口StudentDao,加注解@Dao就可以完成增删改查
4 、创建抽象类继承RoomDatabase,加注解@Database,轻松地建数据库和建表
5 、通过数据库的实例获取dao,调用方法

如果对你有一点点帮助,那是值得高兴的事情。:)
我的csdn:http://blog.csdn.net/shenshizhong
我的简书:http://www.jianshu.com/u/345daf0211ad

相关文章:

Kotlin + 协程 + Room 结合使用

文章目录 前言集成Room结合协程的使用总结 一、前言, 现在kotlin 是趋势&#xff0c;那必然就要用到协程&#xff0c;还有就是随着jetpack 的发力&#xff0c;带来了很多好用的库&#xff0c;比如今天提到Room&#xff0c;是一个类似greenDao的数据库。它不但支持kotlin协程…...

网工记背命令(6)----链路聚合配置

目录 1.配置手工负载分担模式链路聚合 2.配置LACP模式的链路聚合 3.HUAWEI设备与C厂商设备对接 链路聚合&#xff08;Link Aggregation&#xff09;是将多条物理链路捆绑在一起成为一条逻辑链路&#xff0c;从而增加链路带 宽的技术。 常用配置命令 1、执行命令 interface …...

使用 Service 把前端连接到后端

使用 Service 把前端连接到后端 如何创建前端&#xff08;Frontend&#xff09;微服务和后端&#xff08;Backend&#xff09;微服务。后端微服务是一个 hello 欢迎程序。 前端通过 nginx 和一个 Kubernetes 服务暴露后端所提供的服务。 使用部署对象&#xff08;Deployment ob…...

vue 如何优化首页的加载速度?vue 首页白屏是什么问题引起的?如何解决呢?

vue 如何优化首页的加载速度&#xff1f; 路由懒加载ui框架按需加载gzip压缩 vue首页白屏是什么问题引起的 第一种&#xff0c;打包后文件引用路径不对&#xff0c;导致找不到文件报错白屏 解决办法&#xff1a;修改一下config下面的index.js中bulid模块导出的路径。因为in…...

Android平台GB28181设备接入模块之SmartGBD

大牛直播SDK研发的Android平台GB28181设备接入SDK&#xff08;SmartGBD&#xff09;&#xff0c;可实现不具备国标音视频能力的 Android终端&#xff0c;通过平台注册接入到现有的GB/T28181—2016服务&#xff0c;可用于如执法记录仪、智能安全帽、智能监控、智慧零售、智慧教育…...

JVM第十三讲:调试排错 - JVM 调优参数

调试排错 - JVM 调优参数 本文是JVM第十三讲&#xff0c;调试排错 - JVM 调优参数。对JVM涉及的常见的调优参数和垃圾回收参数进行阐述。 文章目录 调试排错 - JVM 调优参数1、Jvm参数2、垃圾回收 问题1&#xff1a;线上ECS治理问题2&#xff1a;白龙马线上服务机JVM参数配置&a…...

Android Gradle权威指南读书笔记

第一章 Gradle入门 生成Gradle Wrapper 命令&#xff1a;gradle wrapper --gradle-version 版本号自定义Gradle Wrapper task wrapper(type : Wrapper) { gradleVersion 2.4 archiveBase GRADLE USER HOME archivePath wrapper/dists distributionBase GRADLE USER HOME …...

顺子日期(蓝桥杯)

文章目录 顺子日期问题描述答案&#xff1a;14字符串解题CC语言指针C语言函数 数组解题 顺子日期 问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小明特别喜欢顺子。顺子指的就是连续的三个数字&#xff1a;123、…...

攻防世界web篇-unserialize3

得出php代码残篇 将代码补全后再在线php运行工具中进行运行 在浏览器输入后得到下面的界面 这里需要将O:4:“xctf”:1:{s:4:“flag”;s:3:“111”;} 改为 O:4:“xctf”:2:{s:4:“flag”;s:3:“111”;}...

微信小程序 onLoad和onShow的区别

在微信小程序中&#xff0c;onLoad() 和 onShow() 是两个常用的生命周期函数&#xff0c;用于监听页面的加载和显示事件。这两个函数的区别如下&#xff1a; 触发时机 onLoad() 函数只会在页面加载时触发一次&#xff0c;而 onShow() 函数每次页面显示时都会被触发。因此&#…...

elementui select组件下拉框底部增加自定义按钮

elementui select组件下拉框底部增加自定义按钮 el-select组件的visible-change 事件&#xff08;下拉框出现/隐藏时触发&#xff09; <el-selectref"select":value"value"placeholder"请选择"visible-change"visibleChange">&…...

深入理解闭包:原理、应用与最佳实践

1、 什么是闭包&#xff1f; 如果一个函数内部定义了另一个函数&#xff0c;并且内部函数引用了外部函数的变量&#xff0c;那么内部函数就形成了一个闭包。 def outer_function(x):# 外部函数接受一个参数 x 是自由变量# seed 也是一个自由变量seed 10def inner_function(y…...

[NSSCTF 2nd]Math

原题py&#xff1a; from secret import flag from Crypto.Util.number import * import gmpy2length len(flag) flag1 flag[:length//2] flag2 flag[length//2:] e 65537m1 bytes_to_long(flag1) p getPrime(512) q getPrime(512) n p*q phi (p-1)*(q-1) d gmpy2.i…...

uml知识点学习

https://zhuanlan.zhihu.com/p/659911315https://zhuanlan.zhihu.com/p/659911315软件工程分析设计图库目录 - 知乎一、结构化绘图1. 结构化——数据流图Chilan Yuk&#xff1a;1. 结构化——数据流图2. 结构化——数据字典Chilan Yuk&#xff1a;2. 结构化——数据字典3. 结构…...

JAVA学习日记1——JAVA简介及第一个java程序

简单记忆 JAVA SE &#xff1a;标准版&#xff0c;核心基础 JAVA EE&#xff1a;企业版&#xff0c;进阶 JDK&#xff1a;Java Development Kit&#xff0c;Java开发工具包&#xff0c;包含JRE JRE&#xff1a;Java Runtime Environment&#xff0c;Java运行时环境&#xff…...

Linux命令(102)之less

linux命令之less 1.less介绍 linux命令less是一个文本文件查看工具&#xff0c;它以一种交互的方式&#xff0c;逐页地显示文本文件的内容&#xff0c;并且可以在文件中进行搜索等定位 2.less用法 less [参数] filename less参数 参数说明-N显示每行的行号-i忽略搜索时的大…...

vue多条件查询

<template><div><input type"text" v-model"keyword" placeholder"关键字"><select v-model"category"><option value"">所有分类</option><option v-for"cat in categories&q…...

c 语言基础:L1-038 新世界

这道超级简单的题目没有任何输入。 你只需要在第一行中输出程序员钦定名言“Hello World”&#xff0c;并且在第二行中输出更新版的“Hello New World”就可以了。 输入样例&#xff1a; 无输出样例&#xff1a; Hello World Hello New World 程序源码&#xff1a; #incl…...

计算机算法分析与设计(13)---贪心算法(多机调度问题)

文章目录 一、问题概述1.1 思路分析1.2 实例分析 二、代码编写 一、问题概述 1.1 思路分析 1. 设有 n n n 个独立的作业 1 , 2 , … , n {1, 2, …, n} 1,2,…,n&#xff0c;由 m m m 台相同的机器 M 1 , M 2 , … , M m {M_1, M_2, …, M_m} M1​,M2​,…,Mm​ 进行加工处…...

小程序canvas层级过高真机遮挡组件的解决办法

文章目录 问题发现真机调试问题分析问题解决改造代码效果展示 问题发现 在小程序开发中需要上传图片进行裁剪&#xff0c;在实际真机调试中发现canvas层遮挡住了生成图片的按钮。 问题代码 <import src"../we-cropper/we-cropper.wxml"></import> <…...

番外8.1 配置+管理文件系统

Task01: Linux 文件系统结构&#xff1b; 可以进行Linux操作系统的文件权限管理与方式切换&#xff0c;可以应用磁盘与文件权限管理工具&#xff1b; 01&#xff1a;常见文件系统类型&#xff08;Ext4[rhel6默认文件管理系统], 存储容量1 EB1073741824 GB; XFS[rhel 7/8默认的文…...

互联网Java工程师面试题·Java 总结篇·第八弹

目录 72、用 Java 的套接字编程实现一个多线程的回显&#xff08;echo&#xff09;服务器。 73、XML 文档定义有几种形式&#xff1f;它们之间有何本质区别&#xff1f;解析XML 文档有哪几种方式&#xff1f; 74、你在项目中哪些地方用到了 XML&#xff1f; 72、用 Java 的套…...

VSCode修改扩展和用户文件夹目录位置(Windows)

VSCode修改扩展和用户文件夹目录位置&#xff08;Windows&#xff09; 前言&#xff1a;方法前期准备&#xff1a;方法1&#xff08;强推荐&#xff09;方法2&#xff08;不太推荐&#xff09;方法3&#xff08;好麻烦&#xff0c;不太推荐&#xff09; 前言&#xff1a; VSCod…...

Spring 事务

文章目录 实现CURD&#xff08;没加入事务前&#xff09;1.加入依赖2.创建jdbc.properties3.配置Spring的配置文件4.数据库与测试表 基于注解的声明式事务准备工作测试模拟场景 加入事务①添加事务配置 Transactional注解标识的位置只读事务属性&#xff1a;超时事务属性&#…...

无法访问 github ,解决办法

一、使用代理&#xff08;首选&#xff09; 这种办法只需要更改github.com为代理的域名即可&#xff0c;使用方式与GitHub除了域名不同其他都一样&#xff0c;速度挺快&#xff0c;可登陆&#xff0c;可提交。 1、查看当前的代理&#xff1a; git config --global --get htt…...

SD卡与emmc的异同

eMMC与SD卡的异同&#xff1a; 物理尺寸和接口&#xff1a; eMMC&#xff1a;eMMC是一种嵌入式存储解决方案&#xff0c;通常采用BGA&#xff08;Ball Grid Array&#xff09;封装&#xff0c;焊接在电路板上。它没有标准的物理尺寸&#xff0c;而是以芯片的形式存在。SD卡&…...

机器学习笔记 - 3D 对象跟踪极简概述

一、简述 大多数对象跟踪应用程序都是 2D 的。但现实世界是 3D 的,无论您是跟踪汽车、人、直升机、导弹,还是进行增强现实,您都需要使用 3D。在 CVPR 2022(计算机视觉和模式识别)会议上,已经出现了大量3D目标检测论文。 二、什么是 3D 对象跟踪? 对象跟踪是指随着时间的…...

《机器学习----简单的分类器》第二章、朴素贝叶斯,项目:使用特征值给语句打标签

贝叶斯分类器 1,朴素贝叶斯算法1. 朴素贝叶斯算法、2. 算法思路3. 贝叶斯定理4.特征的选用的要求和处理 2&#xff0c;算法应用1 文本分类2 垃圾邮件过滤3 情感分析 3. 朴素贝叶斯的优缺点1. 优点2. 缺点 项目实践1&#xff0c;算法流程2&#xff0c;具体实现 1,朴素贝叶斯算法…...

01. 汇编LED驱动实验

01. 汇编LED驱动实验 汇编原理分析为什么要学习Cortex—A汇编STM32IO初始化流程IMX6UL初始化流程 汇编基础处理器内部数据传输指令存储器访问指令 编写驱动编译程序烧写bin文件 汇编原理分析 为什么要学习Cortex—A汇编 需要用汇编初始化一些SOC外设使用汇编初始化DDR&#x…...

Hadoop3教程(二十):MapReduce的工作机制总结

文章目录 &#xff08;109&#xff09;MapTask工作机制&#xff08;110&#xff09;ReduceTask工作机制&并行度ReduceTask工作机制MapTask和ReduceTask的并行度决定机制 &#xff08;122&#xff09;MapReduce开发总结参考文献 &#xff08;109&#xff09;MapTask工作机制…...