Android jetpack Room的简单使用

文章目录

  • 项目添加ksp插件
  • 添加 room 引用
  • 开始使用room
    • 1. 创建bean
    • 2. 创建 dao类
    • 3. 创建database类
  • 数据库升级
  • 复制数据库到指定路径
  • 参考文献

项目添加ksp插件

注意,因为ksp插件 是跟项目中使用的kotlin的版本要保持一致的,否则会报错的

  1. 首先我们去 https://github.com/google/ksp/releases 看一下目前的ksp 的版本是多少,我当时用的时候的版本是2.0.0-1.0.22,这里的版本数字代表的意思是kotlin的版本是2.0.0,ksp的版本是1.0.22

在这里插入图片描述
2. 我们打开项目的gradle/libs.versions.toml文件,如下,我们看到我们使用的kotlin版本是1.9.0,所以我们需要把kotlin的版本升级成2.0.0
在这里插入图片描述

注意: 如果我们在同步项目的时候发现报如下错误的时候,我们可以在settings.gradle.kts文件中配置阿里的maven

在这里插入图片描述

添加如下代码

pluginManagement {repositories {...maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }mavenCentral()gradlePluginPortal()}
}
dependencyResolutionManagement {...repositories {maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }google()mavenCentral()}
}
  1. 在项目的build.gradle.kts文件中添加引用,如下:
    plugins {alias(libs.plugins.androidApplication) apply falsealias(libs.plugins.jetbrainsKotlinAndroid) apply false// apply false 的意思是代表gradle 不会自动应用这个插件,性能优化id("com.google.devtools.ksp") version "2.0.0-1.0.22" apply false
    }
    
  2. 在模块的build.gradle.kts文件中添加如下代码。这样ksp插件就引入成功了
    plugins {...id("com.google.devtools.ksp")
    }
    

添加 room 引用

  1. 在app的build.gradle.kts文件中添加引用
    dependencies {...implementation("androidx.room:room-runtime:2.6.1")annotationProcessor("androidx.room:room-compiler:2.6.1")// To use Kotlin Symbol Processing (KSP)ksp("androidx.room:room-compiler:2.6.1")// optional - Kotlin Extensions and Coroutines support for Roomimplementation("androidx.room:room-ktx:2.6.1")
    }
    

在项目中你会遇到如下 黄色警告,可以点击下面的replace,它会自动的给你替换成使用libs.versions.toml的方式来引用

在这里插入图片描述

开始使用room

1. 创建bean

@Parcelize
@Entity(tableName = "person")
data class Person(@PrimaryKey(autoGenerate = true)var id: Long = 0,// 指定数据库表中列的名字,如果不指定就默认使用字段的名字@ColumnInfo(name = "name")var name: String = "",var gender: String = "",var telephone: String = "",var score: Int = 0,
) : Parcelable

2. 创建 dao类

@Dao
interface PersonDao {@Insert(onConflict = OnConflictStrategy.REPLACE)fun addPeople(person: Person)@Deletefun delPeople(person: Person)@Query("delete from person")fun delAll()@Updatefun update(person: Person)@Query("select * from person order by id asc")fun query(): List<Person>}

3. 创建database类

方式一

@Database(entities = [Person::class], version = 1, exportSchema = false)
abstract class MyDataBase : RoomDatabase() {abstract fun personDao(): PersonDao
}object DataBaseModule {fun getDb(context: Context) = Room.databaseBuilder(context = context,MyDataBase::class.java,"my_database")//允许在主线程中调用//.allowMainThreadQueries().build()}

方式二

@Database(entities = [Person::class], version = 2, exportSchema = false)
abstract class MyDataBase : RoomDatabase() {abstract fun personDao(): PersonDaocompanion object {@Volatileprivate var INSTANCE: MyDataBase? = nullfun getInstance(context: Context): MyDataBase? {return INSTANCE ?: synchronized(this) {val instance = Room.databaseBuilder(context.applicationContext,MyDataBase::class.java,"my_database")//允许在主线程中调用//.allowMainThreadQueries().build()INSTANCE = instanceINSTANCE}}}}

数据库升级

  1. 编写Migration
    // 第一种 更新表结构
    val MIGRATION_2_3 = object : Migration(2, 3) {override fun migrate(db: SupportSQLiteDatabase) {db.execSQL("ALTER TABLE person ADD COLUMN score INTEGER not null default 0")}
    }// 第二种 迁移数据
    val MIGRATION_1_2 = object : Migration(1, 2) {override fun migrate(db: SupportSQLiteDatabase) {//1.  创建一个新表db.execSQL("""create table person_temp(id integer not null primary key autoincrement,name text not null ,gender text not null,telephone text not null,score integer not null default 0)""".trimIndent())//2. 迁移数据db.execSQL("""insert into person_temp(name,gender,telephone)select name,gender,telephone from person""".trimIndent())// 3. 删除旧表db.execSQL("drop table person")// 4. 重新命名新表db.execSQL("alter table person_temp rename to person")}
    }
    
  2. 在 database类中以addMigrations的方式添加进入
    object DataBaseModule {fun getDb(context: Context) = Room.databaseBuilder(context = context,MyDataBase::class.java,"my_database")//允许在主线程中调用//.allowMainThreadQueries().addMigrations(MIGRATION_1_2).addMigrations(MIGRATION_2_3).build()}
    

复制数据库到指定路径

CoroutineScope(Dispatchers.IO).launch {val writableDatabase = db.openHelper.writableDatabaseLog.e(TAG, "initListener: ${writableDatabase.path}")writableDatabase.path?.apply {// 获取数据库文件路径val dbFile = File(this)// 目标文件路径,你可以自定义路径和文件名val path = Environment.getExternalStorageDirectory().absolutePathLog.e(TAG, "initListener: $path")val targetFile = File(path, "copied_database.db")if (targetFile.exists()) {targetFile.delete()}targetFile.createNewFile()// 复制数据库文件try {Log.e(TAG, "initListener: 开始复制")val srcChannel: FileChannel = FileInputStream(dbFile).channelval dstChannel = FileOutputStream(targetFile).channeldstChannel.transferFrom(srcChannel, 0, srcChannel.size())srcChannel.close()dstChannel.close()Log.e(TAG, "initListener: 复制完成")} catch (e: IOException) {e.printStackTrace()}}
}

参考文献

1. Room | Jetpack | Android Developer
2. TheRouter 使用 KSP 处理注解
3. Android从Kapt迁移到ksp
4. 可用的KSP的版本

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

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

相关文章

【06】数据模型和工作量证明-工作量证明

1. 工作量证明的背景 比特币是通过工作量证明来竞争记账权,并获得比特币奖励。简单来讲就是谁能够根据区块数据更快的计算得到满足条件的哈希值,谁就可以胜出,这个块才会被添加到区块链中。我们把这个过程称为挖矿。比特币每10分钟产生1个区块。 2. 工作量证明算法 1. 获…

追梦与立足:专业与学校的双重选择

在人生的关键节点上&#xff0c;选择总是如影随形。对于即将步入大学的学生而言&#xff0c;选择一个合适的专业和学校&#xff0c;无疑是人生道路上的一大抉择。特别是在分数限制下&#xff0c;如何在追梦与立足之间找到平衡点&#xff0c;做出明智的双重选择&#xff0c;成为…

C# Chart 不间断补充

基础步骤 1: 添加引用步骤 2: 创建图表控件步骤 3: 配置图表步骤 4: 添加数据系列步骤 5: 显示图表一个简单的示例注意事项 个人学习首先其次目前用到的判断某个 Series 是否存在设置某个 ChartAreas 的XY轴坐标的范围 基础 在 C# 中使用图表通常涉及到以下几个步骤。这里以 W…

Python18 数据结构与数据类型转换

1.python中的数据结构 在Python中&#xff0c;数据结构是用来存储、组织和管理数据的方式&#xff0c;以便有效地执行各种数据操作。Python提供了几种内置的数据结构&#xff0c;每种都有其特定的用途和操作方法。以下是Python中一些主要的数据结构&#xff1a; 1.列表&#…

攻防世界-2-1

下载附件&#xff0c;发现是一张损坏的png文件&#xff0c;扔winhex里面修改文件头 修改之后发现还是打不开&#xff0c;提示CRC错误&#xff0c;脚本跑一下 循环冗余校验CRC&#xff08;Cyclic Redundancy Check&#xff09;是数据通信领域常用的一种数据传输检错技术。通过在…

记录Nuxt3部署线上pm2启动项目修改端口

看官方文档&#xff1a; TNND&#xff0c;修改这个端口号顶个P用&#xff0c;毛用也没有 实际上应该是这样&#xff1a; 好了&#xff0c;误人子弟&#xff5e;

Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Jun 2024)

Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Jun 2024) Windows 11, version 23H2&#xff0c;企业版 arm64 x64 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…

全球芯片的关键节点

在制造1纳米级别的芯片过程中&#xff0c;涉及到多个关键方面&#xff0c;每个方面都至关重要&#xff0c;包括设备、关键原材料的供应、芯片设计和操作人员的技能与决策能力。 首先&#xff0c;设备是实现1纳米芯片制造的基础。阿斯麦&#xff08;ASML&#xff09;等公司提供…

vue3实现无缝滚动列表-vue3-seamless-scroll

vue3-seamless-scroll-无缝滚动 vue3-seamless-scroll&#xff0c;顾名思义是应用在vue3项目中&#xff0c;在Vue3项目中难免会遇到让列表无缝滚动的需求&#xff0c;本篇文章介绍了关于vue3项目中如何实现表格内容无缝滚动及其属性的使用&#xff0c;需要的朋友可以参考一下。…

太速科技-基于AD916X的直流至 12 GHz 矢量信号发生器 FMC子卡

基于AD916X的直流至 12 GHz 矢量信号发生器 FMC子卡 一、DAC 性能指标&#xff1a; ● DAC 型号&#xff1a;AD9163。 ● 分辨率&#xff1a;16bits。 ● DAC 更新速率&#xff1a;12GSPS。 ● 6GSPS 直接 RF 频率合成。 ● 直流至 3GHz&#xff08;不归零 NRZ 模式&…

VB.net调用VC DLL(二)

参考文献5&#xff0c;讲了在C程序中直接调用DLL和lib的函数方法&#xff0c;不是通过编译器连接方式 也讲了在非C程序中直接调用DLL和lib的函数方法。 实操了一下&#xff0c;建了win32dll项目 新建.h文件和.cpp文件 .h文件中加&#xff1a; void __stdcall funcA(double…

粉笔1000题——判断推理

目录 一、图形推理1. 位置规律平移旋转、翻转 二、定义判断三、类比推理四、逻辑判断 一、图形推理 1. 位置规律 平移 旋转、翻转 二、定义判断 三、类比推理 四、逻辑判断

Python+Pytest+Yaml+Request+Allure框架源代码之(一)common公共方法封装

common模块&#xff1a; get_path.py&#xff1a;获取路径方法 # -*- coding: UTF-8 -*- import os# 项目根目录 BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 配置文件目录 CONFIG_DIR os.path.join(BASE_DIR,config)# 测试用例文件目录 TESTCA…

[SAP ABAP] 删除内表数据

1.利用索引删除数据 语法格式 DELETE <itab> INDEX <idx>. <itab>&#xff1a;代表内表 <idx>&#xff1a;代表索引值 删除内表<itab>中的第<idx>条记录 示例1 lt_student内表中存在3条数据记录 我们使用如下指令删除内表中的第一条数…

Linux 7种 进程间通信方式

传统进程间通信 通过文件实现进程间通信 必须人为保证先后顺序 A--->硬盘---> B&#xff08;B不知道A什么时候把内容传到硬盘中&#xff09; 1.无名管道 2.有名管道 3.信号 IPC进程间通信 4.消息队列 5.共享内存 6.信号灯集 7.socket通信 一、无名管道&a…

mysql中in参数过多该如何优化

优化方式概述 未优化前 SELECT * FROM rb_product rb where sku in(1022044,1009786)方案2示例 public static void main(String[] args) {//往list里面设置3000个值List<String> list new ArrayList<>();for (int i 0; i < 3000; i) {list.add(""…

我在高职教STM32——LCD液晶显示(3)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

Matplotlib的原理与使用详解

文章目录 引言Matplotlib 的原理1. 底层结构2. 绘图流程3. 绘图引擎 Matplotlib 的使用1. 基本使用流程2. 自定义图表3. 保存图表 结论 引言 Matplotlib 是一个 Python 的 2D 绘图库&#xff0c;它提供了丰富的绘图接口&#xff0c;使得用户能够轻松创建各种高质量的图表。从简…

利用 Microsoft ChatGPT 和 OPC UA 改变工业格局

在本文中&#xff0c;我们将探讨开放性在工业物联网中的作用&#xff0c;以及Microsoft为创建基于OPC UA的开放平台所做的努力。我们将讨论 Microsoft 开放战略的四大支柱&#xff0c;以及标准化信息模型以实现互操作性的重要性。此外&#xff0c;我们将深入探讨传统接口和数据…

Redis单线程为什么快

首先&#xff0c;需要明确&#xff0c;Redis只有redis-server是单线程的&#xff0c;指所有的命令处理流程在一个线程中处理。 Redis是内存数据库&#xff0c;所有操作都是基于内存的&#xff0c; 不是CPU密集型的。数据结构高效&#xff0c;不同的对象类型有不同的具体实现。…