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>

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

输出

按下添加
================ 添加 ================
用户  张三   年龄:37
用户  李四   年龄:24
按下删去
================ 删去 ================
用户  张三   年龄:37
按下修正
================ 修正 ================
用户  张三   年龄:66
按下查询
================ 只是查询 ================
用户  张三   年龄:66

最简单版别,完毕。

升级的,这儿就不展开了


参考:/post/709815…