【Android】Room数据库的使用

news/2024/11/17 17:37:07/

简介

Room 是在 SQLite 的基础上推出的 Android 库,它是 Google 官方对数据库操作的推荐方式。使用 Room 可以更方便、高效地操作 SQLite 数据库。

使用

添加依赖

在使用 Room 之前,需要在项目中添加 Room 相关的依赖。在 build.gradle 文件中添加以下依赖:

dependencies {def room_version = "2.3.0"implementation "androidx.room:room-runtime:$room_version"kapt "androidx.room:room-compiler:$room_version"
}

在上面的依赖中,我们添加了 room-runtimeroom-compiler 两个依赖。其中,room-runtime 包含了 Room 库的核心功能,可以让我们进行数据库操作。而 room-compiler 则提供了一些必要的代码生成工具,帮助我们更方便地使用 Room。

数据库实体类

在使用 Room 之前,需要先定义数据表的结构。在 Room 中,数据表结构由实体类来定义。在实体类上使用 @Entity 注解来表示它对应一个数据表。以下是一个定义用户表的实体类:

@Entity(tableName = "user")
data class User(@PrimaryKey(autoGenerate = true) val id: Int = 0,val name: String,val age: Int
)

在上面的代码中,我们使用 @Entity 注解将User类标记为一个数据表,其中:

tableName 表示此数据表的名称。
PrimaryKey 注解表示id字段是这个表的主键,并使用 autoGenerate = true 属性来表示 id 是自动生成的。

数据库访问对象(DAO)

在 Room 中,通过定义 DAO(Data Access Object) 接口来操作数据库。DAO 是一个抽象接口,其中定义了一些操作数据库的方法,例如增删改查等。在 DAO 接口上使用 @Dao 注解标记该接口。

以下是一个定义对用户表增删改查的 UserDao 接口:

@Dao
interface UserDao {@Insertsuspend fun insert(user: User)@Updatesuspend fun update(user: User)@Deletesuspend fun delete(user: User)@Query("SELECT * FROM user WHERE id = :id")suspend fun getById(id: Int): User@Query("SELECT * FROM user")suspend fun getAll(): List<User>
}

在上面的代码中,我们定义了插入、更新和删除用户记录的方法,以及根据 ID 获取用户和获取所有用户记录的方法。需要注意的是,我们为每一个方法都添加了 suspend 关键字,这意味着这些方法在协程中运行。

在上面的代码中,我们使用了 @Insert@Update@Delete@Query 注解来定义相应的操作。具体来说:

@Insert 注解用来定义插入数据的操作。
@Update 注解用来定义更新数据的操作。
@Delete 注解用来定义删除数据的操作。
@Query 注解用来定义查询数据的操作。在 Query 注解中,我们使用了 SQLite 语法来进行查询操作。

数据库

在定义好实体类和 DAO 接口之后,就可以定义数据库了。Room 中只有一个数据库实例,因此我们只需要定义一个具有 @Database 注解的类即可。

以下是一个定义用户数据库的 Database 类:

@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {abstract fun userDao(): UserDaocompanion object {private var INSTANCE: UserDatabase? = nullfun getDatabase(context: Context): UserDatabase {return INSTANCE ?: synchronized(this) {val instance = Room.databaseBuilder(context.applicationContext,UserDatabase::class.java,"user_database").build()INSTANCE = instanceinstance}}}
}

在上面的代码中,我们使用了 @Database 注解来标记 UserDatabase 类是一个数据访问对象。其中:

entities 属性表示此数据库中包含的实体类列表。
version 属性表示此数据库的版本号。
我们还定义了一个abstract的方法来获取 UserDao 实例。同时,我们还定义了一个companion object来提供获取数据库实例的静态方法。

使用

在定义好数据库后,我们可以开始使用它了。以下是一个使用示例:

// 获取数据库实例
val db = UserDatabase.getDatabase(context)// 获取 UserDao 实例
val userDao = db.userDao()// 插入用户
val user = User(name = "xiaoming", age = 18)
userDao.insert(user)// 更新用户
user.age = 20
userDao.update(user)// 查询所有用户
val userList = userDao.getAll()// 查询指定用户
val id = 1
val user = userDao.getById(id)

在上面的代码中,我们首先获取 UserDatabase 实例,然后获取 UserDao 实例。接下来,我们使用 UserDao 实例进行插入、更新和查询操作。

需要注意的是,由于我们在 UserDao 中为每个方法添加了 suspend 关键字,因此调用这些方法时需要使用协程来运行。


http://www.ppmy.cn/news/402955.html

相关文章

Java 小白 重写toString()方法将如下信息输出在控制台上,红色的苹果被称为“糖心富士”,每500克4.98元,买了2500克“糖心富士”,须支付多少钱

class Apple {public String toString(){return "红色的苹果被称为“糖心富士”&#xff0c;每500克4.98元&#xff0c;买了2500克“糖心富士”&#xff0c;须支付多少钱";}public static void main(String[] args){System.out.println(new Apple());} }

二:物理层

一:物理层基本概念 物理层解决如何在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 物理层主要任务:确定与传输媒体接口有关的一些特性。 二:数据通信模型 通信的目的是传送消息。 两种数据传输方式&#xff1b;

百度网盘的登陆

登陆页面的具体细节还没有完善。 二维码移动&#xff1a; bool isMoveLight;public const int MOVE_STEP 10;private void P1_MouseEnter(object sender, EventArgs e){timer1.Enabled true;isMoveLight true;}private void Timer1_Tick(object sender, EventArgs e){if ((i…

zzulioj 1146: 吃糖果

题目描述 HOHO&#xff0c;终于从Speakless手上赢走了所有的糖果&#xff0c;是Gardon吃糖果时有个特殊的癖好&#xff0c;就是不喜欢连续两次吃一样的糖果&#xff0c;喜欢先吃一颗A种类的糖果&#xff0c;下一次换一种口味&#xff0c;吃一颗B种类的糖果&#xff0c;这样&…

Kotlin学习 - 数据类与单例类

数据类 在Java代码中&#xff0c;数据类通常需要重写equals()、hashCode()、toString()这几个方法。虽然有快捷方式可以自动生成&#xff0c;但是还是要我们去点击生成下&#xff0c;并且一个简单的数据类就算没有其他复杂逻辑看着也挺繁琐的&#xff0c;代码如下&#xff1a;…

青桔文案:销售青桔水果文案

水果店线上营销文案大全&#xff0c;帮助水果店线上运营&#xff0c;优质全面的水果文案&#xff0c;让发文案不再词穷。目前已更新水果文案5800多条&#xff0c;共280多类水果。 1、怎么找到这些文案 如果想要这些文案&#xff0c;在朋友圈下有个搜一搜功能&#xff0c;直接搜…

Java | ThreadLocal学习笔记

ThreadLocal&#xff0c;它可以在一个线程中传递同一个对象 学习链接&#xff1a;使用ThreadLocal - 廖雪峰的官方网站 eg&#xff1a; public class ThreadLocalDemo {public static void main(String[] args) throws InterruptedException {Thread t1 new Thread(new Stu…

冰糖心苹果营养价值 冰糖心苹果的功效与作用

其实我们都知道&#xff0c;每天吃一个苹果&#xff0c;不仅对我们身体有益&#xff0c;还会让疾病远离我们&#xff0c;而今天我们所谈的是一种冰糖心苹果&#xff0c;它是众多苹果品种之一&#xff0c;入口脆而甜&#xff0c;它出产于新疆阿克苏&#xff0c;冰糖心苹果的内核…