Android Jetpack之Room数据库的使用(Kotlin+Room)

news2024/11/26 0:40:21

作者:舒呐

一、基本介绍

Room 持久性库在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。具体来说,Room 具有以下优势:

  • 针对 SQL 查询的编译时验证。
  • 可最大限度减少重复和容易出错的样板代码的方便注解。
  • 简化了数据库迁移路径。

Room包含三个主要组件:

  • 数据库类 (DataBase), 用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  • 数据实体(Entity), 用于表示应用的数据库中的表。
  • 数据访问对象(DAO) ,提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。

二、使用详解

1、引入依赖, 在app文件夹下的build.gradle中的dependencies中引入依赖,注意添加id ‘kotlin-kapt’, kapt是必要的,不添加会报错。

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'kotlin-kapt'
}

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0'
    implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'

    def room_version = "2.5.0"

    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation("androidx.room:room-rxjava2:$room_version")

    // optional - RxJava3 support for Room
    implementation("androidx.room:room-rxjava3:$room_version")

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation("androidx.room:room-guava:$room_version")

    // optional - Test helpers
    testImplementation("androidx.room:room-testing:$room_version")

    // optional - Paging 3 Integration
    implementation("androidx.room:room-paging:$room_version")

2、@Entity,使用Room定义一个数据实体User(带Entity注解的类),一个Entity表由主键和一个或多个列组成,User中的每个实例都代表着User表中的一行,tableName后面为表名,在不指定表名的情况下,默认将类名作为数据表的名称。Room默认使用字段名称作为列名称,如需更改,采用@ColumnInfo注解设置name属性(列名)。

/**
 * @PrimaryKey(autoGenerate = true)表示主键自增,参数autoGenerate表示主键可以由数据库自动生成
 * @ColumnInfo(name = "id")表示列的名字为id
 * @Ignore表示会忽略这个字段,不进行记录
 */
@Entity(tableName = "user")
data class User(
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var id: Int = 0,

    @ColumnInfo(name = "userNum")
    val userNum: String,
    @ColumnInfo(name = "userPwd")
    val userPwd: String? = null,
    @ColumnInfo(name = "sex")
    val sex: String? = null,
    @ColumnInfo(name = "age")
    val age: Int ,
    @ColumnInfo(name = "school")
    val school: String? = null,
)

3、@Dao, 使用@Dao注解定义为一个BaseDao接口,增加基本的插入、删除、修改方法,再定义一个UserDao去扩展BaseDao接口,增加需要的方法。

  • @Insert,插入,可以定义将其参数插入数据库中的相应表的方法
  • @Delete,删除,可以定义用于从数据库表中删除特定行的方法
  • @Update,修改,可以定义用于更新数据库表中特定行的方法
  • @Query, 查询,可以从应用的数据库查询指定数据,用于更加复杂的插入、删除、更新操作
@Dao
interface BaseDao<T> {
    @Insert
    fun insert(bean: T)

    @Insert
    fun insertAll(bean: T)

    @Delete
    fun delete(bean:T)

    @Update
    fun update(bean: T)

}

@Dao
interface UserDao : BaseDao<User> {

    @Query("select * from user where userNum = :userNum")
    fun getByNum(userNum: String): User?

    /**
     * 查询表里所有数据
     */
    @Query("select * from user")
    fun getAllUser(): User?

    /**
     * 根据字段删除记录
     */
    @Query("delete from user where userNum = :userNum")
    fun deleteByNum(userNum: String)


    /**
     * 修改指定用户的密码
     */
    @Query("update user set userPwd =:userPwd where userNum =:userNum")
    fun updatePwd(userNum: String, userPwd: String)

}

4、@DataBase, 定义用户保存数据库的MyDataBase类,定义数据库配置。@DateBase类需满足如下条件:

  • 必须带有DataBase注解,此注解中需列出与数据库相关联的实体类数组。
  • 必须是抽象类,用于扩展RoomDataBase
  • 对于每个与数据库关联DAO 类,在该类中必须定义一个具有零参数的抽象方法,并返回 DAO 类的实例。
@Database(
    entities = [User::class],
    version = 1,
    exportSchema = false
)
abstract class MyDataBase : RoomDatabase() {

    abstract fun userDao(): UserDao


    companion object {
        val instance = Room.databaseBuilder(appContext, MyDataBase::class.java, "chat_db").build()
    }
}

5、 在MainActivity中进行调用

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        insertData()
        updateData()
        deleteData()
        queryData()
    }

    /**
     * 插入一条数据
     */
    private fun insertData() {
        lifecycleScope.launch(Dispatchers.IO) {
            MyDataBase.instance.userDao().insert(
                User(
                    userNum = "GSHD",
                    userPwd = "1231343",
                    sex = "女",
                    age = 18,
                    school = "XXXXX"
                )
            )
        }
    }

    /**
     * 查询 userNum = "GSHD" 的记录
     */
    private fun queryData() {
        lifecycleScope.launch(Dispatchers.IO) {
            MyDataBase.instance.userDao().getByNum(
                userNum = "GSHD"
            )
        }
    }

    /**
     * 修改 userNum = "GSHD" 的userPwd
     */
    private fun updateData() {
        lifecycleScope.launch(Dispatchers.IO) {
            MyDataBase.instance.userDao().updatePwd(
                userNum = "GSHD",
                userPwd = "111111",
            )
        }
    }

    /**
     * 删除 userNum = "GSHD" 的数据
     */
    private fun deleteData() {
        lifecycleScope.launch(Dispatchers.IO) {
            MyDataBase.instance.userDao().deleteByNum(userNum = "GSHD")
        }
    }
}


为了帮助大家更好的熟知Jetpack Compose 这一套体系的知识点,这里记录比较全比较细致的《Jetpack 入门到精通》(内含Compose) 学习笔记!!! 对Jetpose Compose这块感兴趣的小伙伴可以参考学习下……

Jetpack 全家桶(Compose)

Jetpack 部分

  1. Jetpack之Lifecycle
  2. Jetpack之ViewModel
  3. Jetpack之DataBinding
  4. Jetpack之Navigation
  5. Jetpack之LiveData

Compose 部分
1.Jetpack Compose入门详解
2.Compose学习笔记
3.Compose 动画使用详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

django ORM框架(操作数据库)

一、ORM框架介绍 ORM框架&#xff0c;把类和数据进行映射&#xff0c;通过类和对象操作它对应表格中的数据&#xff0c;进行增删改查&#xff08;CRUD) ORM框架中 数据库&#xff1a;需要提前手动创建数据库 数据表&#xff1a;与OMR框架中的模型类对应 字段&#xff1a;模…

阿里云,又瘫了!

大家好&#xff0c;我是老杨。 不知道你对前段时间&#xff0c;阿里云瘫痪的事情有印象不&#xff1f; 12月18号&#xff0c;阿里云发生了大规模服务中断的事情——主要是阿里云香港Region可用区C发生大规模服务中断事件。 中断也不是第一次了&#xff0c;但引起我注意的是&…

面向对象技术

面向对象技术 面向对象基础 面向对象基本概念 面向对象分析 面向对线设计 面向对象测试 UML 事务 关系 图 设计模式 创建型设计模式 结构型设计模式 行为型设计模式 面向对象基本概念 面向对象基本概念 达成目标具体需要做哪些事情。 对象 : 基本的运行实体,为类的实…

Vector - CAPL - CANoe硬件配置函数 - 05

目录 resetCan -- 重置CAN控制器 代码示例 ResetCanEx -- 重置CAN控制器的特定CAN通道 代码示例 ScanBaudrateActive -- 特定通道设置波特率 ScanBaudratePassive -- 开始扫描并检测给定通道上的波特率 resetCan -- 重置CAN控制器 功能&#xff1a;重置CAN控制器&#xf…

(2020)End-to-end Neural Coreference Resolution论文笔记

2020End-to-end Neural Coreference Resolution论文笔记 Abstract1 Introduction2 Related Work3 Task4 Model4.1 Scoring Architecture4.2 Span Representations5 Inference6 Learning7 Experiments7.1 HyperparametersWord representationsHidden dimensionsFeature encoding…

学习HCIP的day.06

十一、OSFP扩展知识点 1、关于OSPF状态机的问题 &#xff08;1&#xff09;在MA网络中&#xff08;要进行DR/BDR选举&#xff09;存在7种状态机&#xff0c;init是路由器A收到邻居B的hello包&#xff0c;但该hello包中没有A的RID&#xff1b; &#xff08;2&#xff09;在点到…

汽车EEA架构演进以及域控制器发展介绍

1、重要名词解析 &#xff08;1&#xff09;SDV&#xff1a;软件定义汽车&#xff1b; &#xff08;2&#xff09;SOA &#xff1a;一种 C/S 架构的软件设计方法&#xff1b; &#xff08;3&#xff09;OTA&#xff1a;空中下载技术&#xff08;Over-the-Air Technology&#x…

【MySql】数据库事务

事务 事务事务的操作事务并发处理可能出现的问题隔离级别MVCC&#xff1a;多版本并发控制 事务 事物本质上指一条 sql 语句或一组 sql 组合 事务的特性&#xff1a;ACID 1、原子性&#xff1a;一个事务&#xff0c;要么一次性完成&#xff0c;要么就不做 2、一致性&#xff1…

STM32驱动超声波+OLED显示,并上传数据到云端(ONENET)

本文将介绍如何使用STM32F103C8T6单片机和HC-SR04超声波测距模块来实现测距功能&#xff0c;并通过0.96寸OLED屏幕显示测距结果。 首先&#xff0c;我们需要了解一下HC-SR04超声波测距模块的工作原理。该模块通过发送超声波脉冲并接收回波信号的时间来计算物体与模块之间的距离…

C++ STL 标准模板库介绍与入门

目录 1、概述 1.1、C 标准库 1.2、Boost库 2、STL 版本 2.1、HP 原始版本 2.2、P. J. 实现版本 2.3、RW 实现版本 2.4、SGI 实现版本 2.5、STLport 实现版本 3、STL 的六大组件 3.1、STL 六大组件构成 3.2、六大组件的交互关系 4、STL 的重要性 5、总结 VC常用功…

java spring MVC之RESTful快速开发

我这里有个一springboot项目 我在启动类同目录下创建了一个目录 目录名叫 controller 里面有一个UserController diam结构是这样的 package com.example.threshold.controller;import com.example.threshold.user; import org.springframework.stereotype.Controller; import…

平衡二叉树理论详解

文章目录 基本概念平衡二叉树插入结点LL&#xff08;左单旋&#xff09;RR&#xff08;右单旋&#xff09;LR&#xff08;左右旋&#xff09;RL&#xff08;右左旋&#xff09; 示例插入推导过程 基本概念 平衡二叉树是一棵空树或它的左右两个子树的高度差的绝对值不超过1&…

Maven ( 二 ) 项目应用

4.资源管理 4.0.pom.xml Maven的pom.xml是一个项目对象模型(Project Object Model)&#xff0c;它是Maven项目的构建文件。它描述了一个项目的基本信息&#xff0c;包括项目依赖、插件、仓库等信息。 下面是一个简单的pom.xml示例&#xff1a; <project xmlns"http…

深度学习用于医学预后-第二课第三周4-7节-关于事件的时间数据,认识处理删失数据

在本课中&#xff0c;我们将讨论生存数据。为了能够对生存进行建模&#xff0c;我们需要能够以我们可以处理的形式表示数据。 主要的挑战是删失数据&#xff0c;这是一种特殊形式的缺失数据。我们接下来将要研究这一点。 在这节课中&#xff0c;我们将谈论生存数据和删失。 …

LeetCode 96 不同的二叉搜索树

题目&#xff1a; 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&#xff1a;n 1 …

第七章:C语言的操作符

说起操作符大家都不陌生&#xff0c;从我们最初的 - c * / 加减乘除&#xff0c;到更加深奥的操作符&#xff0c;而今天我要有完整的系统来理清楚C语言的操作符到底有什么&#xff0c;和它们相关的用法&#xff0c;话不多说&#xff0c;直接走进今天的主题----C语言的操…

保护个人隐私和数据安全的方法与策略

引言 随着信息技术的普及和发展&#xff0c;我们享受到了便捷的互联网服务&#xff0c;但与此同时&#xff0c;个人隐私和数据安全问题也日益受到威胁。在这个所谓的"裸奔"时代&#xff0c;网络攻击、数据泄露和隐私侵犯已经成为常态。然而&#xff0c;我们并不无助…

sysfs文件系统

sysfs系统介绍 sysfs系统sysfs系统是什么&#xff1f;koject的内核对象模型基础kobject结构体定义kest bus如何管理driver和devicebus_type 结构体 小知识什么是挂载mount命令 &#x1f4cc;————本章重点————&#x1f4cc; &#x1f517;了解sysfs系统概念; &#x1f5…

布谷鸟hash算法的并行化实现(一)

由于本人最近在写一个项目&#xff0c;为了实现数据查找以及数据修改部分的快速操作&#xff0c;所以采用hash对数据进行存储&#xff0c;而在此过程中接触到了布谷鸟hash&#xff0c;觉得这个hash算法还是很有意思并且高效&#xff0c;所以想着进行一些记录&#xff0c;本系列…

一文带你快速掌握如何读懂 YonBuilder移动开发 的项目源码

本文将通过四大步的简单讲述&#xff0c;让新手开发者朋友们快速掌握阅读YonBuilder移动开发项目源码的技巧方法。 1.读懂代码的第一步&#xff0c;了解项目的整体文件结构 CSS: 存放css样式的文件&#xff1b; feature&#xff1a;猜测是用来存放特征文件的&#xff0c;实际…