IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Jetpack-Room数据库 -> 正文阅读

[移动开发]Jetpack-Room数据库

使用Room将数据保存到本地数据库

简介

Room持久库在SQLite之上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能够流畅的访问数据库,具体来说,Room有以下优点:

  • SQL查询的编译时验证
  • 提供方便的注解,能最大减少重复和易错的样板代码
  • 简化了数据库迁移路径

因此建议使用Room,而不是直接操作SQLite API。

设置

build.gradle中,添加以下依赖:

//Kotlin annotation processing tool plugin
apply plugin: 'kotlin-kapt'

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

主要组件

Room包含了三个主要的组件:

  • 数据库类androidx.room.Database: 此对象持有数据库,并为应用持久化数据的底层连接提供主要的入口。
  • 数据实体Entity: 对应数据库表。
  • 数据访问对象DAO: 一个接口或抽象类,提供数据库的CRUD抽象操作方法,编译时Room会自动生成DAO对应的实现实例。

androidx.room.Database为app提供了关联数据库的DAO实例。因此,app可以使用这些DAO方法从数据库检索数据,以作为关联的数据实体对象的实例。此外,app还可以使用定义的数据实体对关联的表进行插入或更新单行或多行操作。下图展示了Room各组件间的关系:20220330155338.png

示例

本部分展示了真实项目开发中的一个缩影。

项目中新建数据库相关的包

20220330161201.png

  1. dao:存放数据访问对象
  2. database:存放数据库对象
  3. entity: 存放数据表实体

数据实体类

以下代码通过注解@Entity提供了一个数据实体LoginUser,每个LoginUser实例都代表tbl_login_user表中的一行数据。

/**
 * 登录用户
 */
@Entity(tableName = "tbl_login_user")
data class LoginUser(
    @PrimaryKey
    @ColumnInfo(name = "user_id")
    val userId: String,
    //登录名
    @ColumnInfo(name = "login_name")
    val loginName: String?,
    //用于展示的名称
    @ColumnInfo(name = "user_name")
    val userName: String?,
    //头像
    @ColumnInfo(name = "avatar")
    val avatar: String?,
    //性别 0-男,1-女
    @ColumnInfo(name = "gender")
    val gender: Int?,
    //加密后的密码
    @ColumnInfo(name = "pwd_encrypt")
    val pwdEncrypt: String?,
    @ColumnInfo(name = "phone")
    val phone: String?,
    //第三方登录平台类型(目前未涉及)
    @ColumnInfo(name = "third_type")
    val thirdType: String?,
    //第三方token登录(目前未涉及)
    @ColumnInfo(name = "third_token")
    val thirdToken: String?,
    //token
    @ColumnInfo(name = "token")
    val token: String,
    //刷新token
    @ColumnInfo(name = "refresh_token")
    val refreshToken: String?,
    //是否记住密码:1-记住,0-不记住
    @ColumnInfo(name = "remember_pwd")
    val rememberPwd: Int,
    //是否自动登录:1-自动登录,0-不自动登录
    @ColumnInfo(name = "auto_login")
    val autoLogin: Int,
    //登录成功次数
    @ColumnInfo(name = "login_count")
    val loginCount: Int,
    //账号是否启用:1-启用,0-不启用
    @ColumnInfo(name = "enable")
    val enable: Int,
    //附加信息,扩展用
    @ColumnInfo(name = "extra")
    val extra: String?,
    @ColumnInfo(name = "create_timestamp")
    val createTimestamp: String,
    @ColumnInfo(name = "update_timestamp")
    val updateTimestamp: String,
    @ColumnInfo(name = "create_time")
    val createTime: String,
    @ColumnInfo(name = "update_time")
    val updateTime: String
)

DAO

以下代码通过@Dao注解定义了一个LoginUserDao接口(抽象类亦可),该接口为app提供了操作tbl_login_user表的方法。

/**
 * 提供登录用户表[LoginUser]相关的操作方法
 */
@Dao
interface LoginUserDao {
    /**
     * 插入或替换一条或多条记录
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertOrReplace(vararg loginUser: LoginUser)

    /**
     * 查询最近一条自动登录信息
     */
    @Query("SELECT * FROM tbl_login_user WHERE auto_login == 1 ORDER BY update_timestamp DESC LIMIT 0,1")
    fun queryLatestAutoLoginUser(): LoginUser

    /**
     * 删除旧数据,时间倒排1000条之前的数据
     */
    @Query("DELETE FROM tbl_login_user WHERE user_id NOT IN (SELECT user_id FROM tbl_login_user ORDER BY update_timestamp DESC LIMIT 0,1000)")
    fun deleteOldData()
}

Room数据库类

以下的代码通过注解@Database定义了一个持有数据库的抽象类,此类提供了数据库的配置和app访问数据库的入口。定义此类必须满足以下条件:

  • 必须带有注解@Database,注解中需要有entities数组,数组中有数据表对应的数据实体。
  • 必须继承自RoomDatabase,且为抽象类。
  • 必须有定义无参的DAO抽象方法。

注意: 由于数据库实例的创建很耗资源,日常的单进程app场景中,应该尽可能的采用单例模式创建Room数据库实例。

/**
 * app数据库
 */
@Database(version = 1, entities = [LoginUser::class])
abstract class AppDatabase : RoomDatabase() {
    abstract fun loginUserDao(): LoginUserDao

    companion object {
        @Volatile
        private var instance: AppDatabase? = null

        /**
         * 单例
         */
        @Synchronized
        fun getInstance(): AppDatabase {
            if (instance == null) {
                instance = Room.databaseBuilder(Utils.getApp(), AppDatabase::class.java, "app_data_db")
                    .fallbackToDestructiveMigration()//数据库版本发生变更策略:清除数据并重建数据表
                    .build()
            }
            return instance as AppDatabase
        }
    }
}

使用

通过AppDatabase类中提供的抽象方法获取DAO实例操作数据库:

val loginUserDao: LoginUserDao = AppDatabase.getInstance().loginUserDao()
val loginUser: LoginUser = loginUserDao.queryLatestAutoLoginUser()
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-04 12:22:54  更:2022-04-04 12:23:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 20:47:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码