Jetpack之Room数据库 本也无奇但搭Jetpack风味更佳

639 阅读1分钟

Emm,数据库。谷歌的Room本身也不多大特别。

诚如Greendao也是非常好的东西。

但是,既然Room是Jetpack全家桶里面的东西,那么既然都Jetpack了,当然要Room了。

全家桶呀全家桶,搭配自然爽歪歪。

来吧,少年。

一些基础配置

  • build.gradle (项目级)
ext { roomVersion = '2.4.2' }
  • build.gradle (app)

dependencies{
    //ktx
    implementation 'androidx.core:core-ktx:1.8.0'

    // room
    implementation "androidx.room:room-runtime:$rootProject.roomVersion"
    implementation "androidx.room:room-ktx:$rootProject.roomVersion"
    kapt "androidx.room:room-compiler:$rootProject.roomVersion"
    implementation "androidx.room:room-ktx:2.3.0"
}

一、Room数据库

我们知道,数据库嘛

经典三叉戟,实体类Dao数据库(database)

然后一般,弄多一个管理类。来管理 数据库

那就来吧

一个简单学生数据库,增删改查

实体类

/**
 *
 * 数据实体
 *
 *  1、@Entity:Room实体类注解 ---> 默认情况下,Room 将【类名称】用作数据库【表名称】
 *      注:如果您希望【数据库表】具有不同的名称,请设置 @Entity 注解的 tableName 属性
 *  2、PrimaryKey: 主键( autoGenerate = true 主键自增 ),作用:唯一标识相应数据库表中的每一行
 *  3、@ColumnInfo:数据库表字段---> 默认情况下,使用【字段名称】作为数据库中的【列名称】
 *      注:如果您希望【数据表里的列】具有不同的名称,请将 @ColumnInfo 注解添加到该字段并设置 name 属性
 *  4、Ignore: 默认情况下,Room 会为实体中定义的每个字段创建一个列。 如果您不想保留该字段,则可以使用 @Ignore 为字段添加注解
 */
@Entity(tableName = "loginUser")
data class User(
    @PrimaryKey(autoGenerate = true)
    var id: Int = 0,
    @ColumnInfo(name = "name")
    var aliasName: String = "",
    var age: Int = 0,


) {
    constructor(aliasName: String, age: Int) : this() {
        this.aliasName = aliasName
        this.age = age
    }
}

Dao 操作类


/**
 * 数据访问对象
 */
@Dao
interface UserDao {
    // 查询
    @Query("SELECT * FROM loginUser")
    fun queryAllUser(): MutableList<User>

    //根据姓名参数查询
    @Query("SELECT * FROM loginUser WHERE name = :name")
    fun queryFindUser(name: String): User?

    // 添加单条数据
    @Insert
    fun addUser(vararg user: User)

    // 添加批量数据
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun addBatchUser(list: MutableList<User>)

    // 更新某一个数据
    @Update
    fun updateUser(vararg user: User)

    //更新所有数据
    @Query("UPDATE loginUser set age='50'")
    fun updateAll()

    //删除某一个数据
    @Delete
    fun deleteSingle(vararg user: User)

    @Query("DELETE FROM loginUser WHERE name = :focusName")
    fun deleteSingleByName(focusName: String)

    //删除表里所有数据
    @Query("DELETE FROM loginUser")
    fun deleteAllUser()
}

Database类

/**
 * 数据库创建
 * entities: 实体类
 * version: 数据库初始版本号
 * exportSchema: 是否允许数据库架构将导出到给定的文件夹中【 默认true 】
 *
 */
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class UserDatabase : RoomDatabase() {

    //创建userDao
    abstract fun userDao(): UserDao
}

Manager类 (也可以不要)

object DbManager {
    //数据库名
    private const val dbName: String = "userroom"

    //懒加载创建数据库
    val db: UserDatabase by lazy {
        Room.databaseBuilder(
            App.appContext.applicationContext, UserDatabase::class.java, dbName
        ).allowMainThreadQueries()//允许在主线程操作
            .build()
    }
}

运行

activity

class MainActivity : AppCompatActivity() {

    var userDao: UserDao = DbManager.db.userDao()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        userDao.deleteAllUser()

        // 增加
        val age1 = Random.nextInt(20, 40)
        val user1 = User("张三", age1)
        userDao.addUser(user1)

        findViewById<Button>(R.id.btnAdd).setOnClickListener {
            val age2 = Random.nextInt(20, 40)
            val user2 = User("李四", age2)
            userDao.addUser(user2)
            queryAllUserPrint("增加")
            Toast.makeText(this, "添加", Toast.LENGTH_SHORT).show()
        }

        findViewById<Button>(R.id.btnDelete).setOnClickListener {
            // 删除
            userDao.deleteSingleByName("李四")
            queryAllUserPrint("删除")
        }

        findViewById<Button>(R.id.btnUpdate).setOnClickListener {
            // 修改
            val queryAllUser = userDao.queryFindUser("张三")
            if(queryAllUser!=null){
                queryAllUser.age = 66
                userDao.updateUser(queryAllUser)
            }
            queryAllUserPrint("修改")
        }

        findViewById<Button>(R.id.btnQuery).setOnClickListener {
            // 查
            queryAllUserPrint("仅仅查询")
        }


    }

    private fun queryAllUserPrint(tips: String) {

        val  tvResult = findViewById<TextView>(R.id.tvResult)
        tvResult.setText("")


        Log.d("User", "================ " + tips + " ================")
        val queryAllUser = userDao.queryAllUser()

        var allResultStr = ""
        for (entity in queryAllUser) {
            var restltStr = "用户  ${entity.aliasName}   年龄:${entity.age}"
            Log.d("User", restltStr)
            allResultStr = allResultStr+restltStr+"\n"
        }

        tvResult.setText(allResultStr)
    }


}

APP

class App : Application() {


    companion object {
        lateinit var appContext: Context
    }

    override fun onCreate() {
        super.onCreate()
        appContext = applicationContext
    }
}

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp"
    tools:context=".MainActivity"

    android:gravity="center"
    >

    <Button
        android:id="@+id/btnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="增加"/>

    <Button
        android:id="@+id/btnDelete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="删除"/>

    <Button
        android:id="@+id/btnUpdate"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="修改"/>

    <Button
        android:id="@+id/btnQuery"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询"/>

    <TextView
        android:id="@+id/tvResult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:hint="result"
        />

<!--    <EditText-->
<!--        android:id="@+id/searchBox"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="wrap_content"-->
<!--        android:hint="Search Keyword" />-->

<!--    <TextView-->
<!--        android:id="@+id/searchResultsText"-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="wrap_content"-->
<!--        android:layout_marginTop="16dp"-->
<!--        android:text="Search Results" />-->

</LinearLayout>

image.png

输出

按下添加
================ 增加 ================
用户  张三   年龄:37
用户  李四   年龄:24


按下删除
================ 删除 ================
用户  张三   年龄:37

按下修改
================ 修改 ================
用户  张三   年龄:66


按下查询
================ 仅仅查询 ================
用户  张三   年龄:66


最简单版本,完毕。

升级的,这里就不展开了


参考:juejin.cn/post/709815…