Jetpack组件Room的学习使用(附代码)

目录

前言

一、Room的设计模式

二、实际操作(附代码,相关说明在注解中)

1.引入Gradle 依赖(官网推荐配置)

2.实体类(Entity)

3. 创建 DAO 接口: 创建一个用于访问笔记数据的 DAO 接口

4.声明数据库类:

5.userRoom的写法(简单写一下,不使用Adapter等操作了)

 6.结果显示

总结


前言

以前学过Room的设计模式,但是有关细节处理方面有些忘记了,比如一些注解为何这样写什么的,现在我忘记了还真答不上来,在这里重拾一下过去的知识,以便更好的学接下来的有关Room进阶的知识。


一、Room的设计模式

  1. 实体(Entity): 定义数据库中的表结构。每个实体类对应数据库中的一个表,类中的每个字段对应表中的一个列。通常,实体类使用 @Entity 注解进行标记,并且每个实体类需要定义一个主键。

  2. 数据访问对象(DAO): 提供用于访问数据库的方法。每个 DAO 类都包含一组用于执行 CRUD 操作(创建、读取、更新、删除)的方法。DAO 类通常使用 @Dao 注解进行标记,并且可以使用 Room 提供的各种注解来定义查询、更新和删除方法。

  3. 数据库(Database): 是 Room 库的核心组件,表示应用程序的数据库。数据库类应该是抽象类,并且通常会扩展 RoomDatabase。在数据库类中,您需要定义与数据库相关联的实体列表,并提供一个方法来获取与数据库关联的 DAO

:Room是使用SQLite 数据库的持久性库的,为体现这种解耦的设计模式,我们进行了必要封装使用,使程序看的更加简洁明了,也更容易维护不易出错。

比如一个人来图书馆借书:

1.李华(要借三本书,需要借一个月),这李华name, 书本数量number,借书事件monthtime这会被封装成一个实体(Entity)

2.李华接下来要去操作平台或者手机进行借书的相关流程(登记),这就是数据访问对象(DAO)

3.整个书源和相关平台管理等就是数据库(Database)

二、实际操作(附代码,相关说明在注解中)

1.引入Gradle 依赖(官网推荐配置)

代码如下(示例):

implementation "androidx.room:room-runtime:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"
implementation "androidx.room:room-ktx:2.6.1"

2.实体类(Entity)

代码如下(示例):

@Entity(tableName = "notes")//实体类中使用 @Entity注解时指定数据库表的名称为 "notes"
data class Note(
    @PrimaryKey(autoGenerate = true)//id设置为主键,并自动增长
    val id: Long = 0,
    val title: String,
    val content: String
)

3. 创建 DAO 接口: 创建一个用于访问笔记数据的 DAO 接口

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao
interface NoteDao {

//调用方可以通过调用 getAllNotes() 方法来获取数据库中所有笔记的列表

//返回一个List<Note> 类型的列表,具体的实现注解已经完成了
    @Query("SELECT * FROM notes")
    fun getAllNotes(): List<Note>

    @Insert
    fun insert(note: Note)
}

4.声明数据库类:

 创建一个继承自 RoomDatabase 的抽象类(RoomDatabase 是 Android 中用于管理和访问 Room 数据库的抽象类。继承其中然后实现其中的方法),并在其中声明数据库版本和实体列表,获得数据库的操作,而且一般设计为单例模式。

@Database(entities = [Note::class], version = 1, exportSchema = false)
//这个注解用于声明数据库的信息,如实体类信息,版本信息
//AppDatabase类被声明为抽象类的主要原因是为了定义数据库的结构,而不提供数据库的具体实现
abstract class AppDatabase : RoomDatabase() {
    abstract fun noteDao() : NoteDao //提供NoteDao的抽象方法

    companion object {//companion object中的成员在类的级别上是静态的,且只访问一次
        private var instance: AppDatabase ?= null //等会用来接收创建实例的
        fun getInstance(context: Context) : AppDatabase {
            return instance ?: synchronized(this){
                //是空就创建数据库(单例模式)
                Room.databaseBuilder(context, AppDatabase::class.java, "db_feng")
                    .build().also { instance = it }// 使用 also 函数将构建的数据实
                                                   // 赋值给 instance变量,并返实例
            }
        }
    }
}

5.userRoom的写法(简单写一下,不使用Adapter等操作了)

package com.example.applicationflow
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import com.example.applicationflow.Entity1.Note
import com.example.applicationflow.db2.AppDatabase
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext

class UserRoom : AppCompatActivity() {
    private lateinit var db : AppDatabase
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_user_room)

        db = AppDatabase.getInstance(applicationContext)
        findViewById<Button>(R.id.buttonAddNote).setOnClickListener{
            addNote()
            displayNotes()
        }
    }
    private fun addNote(){
        val title = findViewById<EditText>(R.id.editTextTitle).text.toString()//获取布局编辑框内容
        val context = findViewById<EditText>(R.id.editTextContent).text.toString()
        //在主线程上执行了数据库操作,而 Room 不允许在主线程上执行长时间运行的数据库操作,使用协程
        CoroutineScope(Dispatchers.IO).launch {
            Log.d("feng", "hua")
            db.noteDao().insert(Note(title = title, content = context))
        }
    }
    //回到主线程
        private fun displayNotes() {
            CoroutineScope(Dispatchers.Main).launch {
                try {
                    val notes = withContext(Dispatchers.IO) {
                        db.noteDao().getAllNotes() // 在 IO 线程中获取笔记数据
                    }

                    val noteTextList = notes.joinToString("\n") { "${it.title}: ${it.content}" } // 将笔记数据转换为一个字符串
                    val textView = findViewById<TextView>(R.id.textViewNotes)
                    textView.text = noteTextList
                    Log.d("feng", "jian")
                    //applicationContext 是应用程序级别的上下文,可以在整个应用程序范围内访问
                    Toast.makeText(applicationContext, "显示成功", Toast.LENGTH_SHORT).show()
                } catch (e: Exception) {
                    // 错误处理
                    Toast.makeText(applicationContext, "显示失败:${e.message}", Toast.LENGTH_SHORT).show()
                }
            }
        }
}

 6.结果显示


总结

还是要多复习,多练练一些细节,不懂的多查查,特别官网上的最新解释,有时能解释你的困惑,有安卓方面的大佬可以多指点一下我这个菜鸟。

  • 54
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Jetpack是一套基于Android开发语言Kotlin组件库,目的是帮助Android开发者快速构建健壮的、高效的应用程序。Jetpack架构组件从入门到精通是一本介绍Jetpack组件库的电子书,其内容向读者提供了Jetpack组件库的最基础的知识体系,以及对组件库的更高阶的实践知识和技能分享。 在读者学习这本电子书时,首先会学习到基本的Jetpack概念,并了解到如何使用各种工具来实现底层代码、布局和资源文件的编写。同时,电子书重点讲解了Jetpack组件库中最常用的组件,比如ViewModel、LiveData、Room、WorkManager等,它们各自的功能和用法,让读者熟知Jetpack组件的基本运作原理。读者还会学习如何将这些组件综合使用,以构造真正的应用程序。在内容的后半部分,电子书重点讲解了Jetpack在架构层面的设计,以及如何更有效的使用和管理组件库。 总之,Jetpack架构组件从入门到精通这本电子书非常适合想要学习Jetpack组件库的Android初学者和有一定开发经验的开发者,能够帮助他们快速掌握Jetpack组件库,以及提高软件的可扩展性和有效性。 ### 回答2: Jetpack架构组件是一组Android软件组件和库,通过这些组件和库,开发者可以更加轻松地开发应用程序,并提供高质量的用户体验。Jetpack架构组件包括众多不同的组件和库,这些组件和库都具有不同的用途和功能。对于开发者来说,学习Jetpack架构组件是非常重要的。 《jetpack架构组件从入门到精通 pdf》是一份针对Jetpack架构组件学习资料。它是可以帮助开发者更好地理解和掌握Jetpack架构组件的重要手册。通过这份PDF文档,开发者可以学习Jetpack架构组件的基本概念、用途和功能,并了解如何将这些组件和库应用到他们的应用程序开发中。 这份PDF文档涵盖了Jetpack架构组件的多个方面,包括ViewModel、LiveData、Data Binding、Room、Navigation、WorkManager等等。每个章节都包含了详细的介绍和具体的用例,从而帮助开发者更好地理解每个组件和库的用途和功能。 无论是初学者还是经验丰富的开发者,都可以从这份PDF文档中获益。它可以帮助初学者更轻松地入门Jetpack架构组件,并提供了有用的工具和技巧。对于经验丰富的开发者来说,这份PDF文档可以帮助他们更深入地了解Jetpack架构组件,并提供了一些高级技术和策略,以优化应用程序性能和用户体验。 总之,Jetpack架构组件从入门到精通的PDF文档是一份非常有价值的资源,它可以帮助开发者更好地理解和掌握Jetpack架构组件,从而更加轻松地开发高质量的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Imagine8877

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值