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,一经查实,立即删除!

相关文章

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;

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

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

粉笔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 平台寻求认同感和成就…

一键智能整理TXT文档,高效删除连续行,轻松提升工作效率与数据管理效能

信息爆炸的时代&#xff0c;TXT文档作为我们日常工作中不可或缺的一部分&#xff0c;承载着大量的数据和信息。然而&#xff0c;随着文档内容的不断增加&#xff0c;连续重复的行数也逐渐增多&#xff0c;这不仅影响了文档的整洁度&#xff0c;还大大降低了我们处理数据的效率。…

Monica

在 《long long ago》中&#xff0c;我论述了on是一个刚出生的孩子的脐带连接在其肚子g上的形象&#xff0c;脐带就是long的字母l和字母n&#xff0c;l表脐带很长&#xff0c;n表脐带曲转冗余和连接之性&#xff0c;on表一&#xff0c;是孩子刚诞生的意思&#xff0c;o是身体&a…

24年下半年各省自考报名时间汇总

24年下半年各省自考报名时间汇总

2024年【N1叉车司机】考试及N1叉车司机考试题库

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机考试是安全生产模拟考试一点通总题库中生成的一套N1叉车司机考试题库&#xff0c;安全生产模拟考试一点通上N1叉车司机作业手机同步练习。2024年【N1叉车司机】考试及N1叉车司机考试题库 1、【多选题】《中…

独角兽品牌獭崎酱酒:高性价比的酱香之选

在酱香型白酒领域中&#xff0c;獭崎酱酒以其独特的品牌定位和高性价比迅速崛起&#xff0c;成为市场上备受关注的独角兽品牌。作为贵州茅台镇的一款新秀酱香酒&#xff0c;獭崎酱酒不仅传承了百年酿造工艺&#xff0c;还以创新的商业模式和亲民的价格赢得了广大消费者的青睐。…

BLDC无感控制策略

本文根据 BLDC 的电路模型推导了一个简 化磁链方程来估计转子位置,转速适用范围较 广;重点分析了反电动势和换相电流对转矩脉动 的影响;设计了一种BLDC的无速度传感器高速 驱动控制方案。通过试验验证了新型控制策略 的性能。 1 低速时的转子位置检测 图1 为高速无刷直流电…

数学建模基础:线性模型

目录 前言 一、线性方程组 二、线性规划 三、线性回归 四、线性模型的应用 五、实例示范&#xff1a;医疗成本预测 步骤 1&#xff1a;导入数据 步骤 2&#xff1a;数据预处理 步骤 3&#xff1a;建立多元线性回归模型 步骤 4&#xff1a;模型验证 步骤 5&#xff1…

重生奇迹MU 浅析智力妹妹的现状与天赋

早期的重生奇迹MU游戏中&#xff0c;智力系女性角色通常被简称为“奶娘”&#xff0c;因为她们天生就是辅助定位&#xff0c;能够为队友提供很多帮助。那个时代的游戏非常艰难&#xff0c;升级困难&#xff0c;装备和宝石很难获得&#xff0c;使用药品的消耗也非常大。因此&…

Python中的性能分析和优化

在前几篇文章中&#xff0c;我们探讨了Python中的异步编程和并发编程&#xff0c;以及如何结合使用这些技术来提升程序性能。今天&#xff0c;我们将深入探讨如何分析以及优化Python代码的性能&#xff0c;确保应用程序的高效运行&#xff01; 性能分析的基本工具和方法 在进…

screenshot-to-code之安装、测试

准备 GPT收费账号 screenshot-to-code Supported AI models: GPT-4O - Best model!GPT-4 Turbo (Apr 2024)GPT-4 Vision (Nov 2023)Claude 3 SonnetDALL-E 3 for image generation git或者手动 下载源代码 https://github.com/abi/screenshot-to-code pip install poetry (…