文档章节

Room使用简介

t
 tommwq
发布于 2019/11/15 20:02
字数 873
阅读 8
收藏 0

Room简介

Room是jetpack中的一个组件,它提供了ORM功能。Room用起来非常方便,并且可以和LiveData结合,大大降低手动操作数据的复杂度。Room包含3个主要的组件:

  • Database。表示一个数据库。
  • Entity。定义了数据表的结构。
  • DAO。提供访问数据库的接口。

在使用Room时,这三个组件都会用到。

Entity

Entity用于定义数据表的结构。我们首先看一个简单的例子。

@Entity(tableName="users")
data class User (
    @PrimaryKey var uid: Int,
    @ColumnInfo(name = "first_name") var firstName: String?,
    @ColumnInfo(name = "last_name") var lastName: String?
    @Ignore var picture: Bitmap?
)


这里使用了很多注解。@Entity表示类是一个Entity对象,tableName参数是Entity的表名。@PrimaryKey表示域是一个主键。Room要求主键必须是Int或Long型。@ColumnInfo声明了列名和域名的对照关系。如果列名和域名相同,可以省略这个注解。@Ignore表示这个域在数据表中没有对应的列。因此上面这个Entity对应的SQL模式就是

CREATE TABLE users (
    INT uid PRIMARY KEY,
    TEXT first_name,
    TEXT last_name
);


可以看出来,从Entity到SQL的映射是非常直观的。

Entity不仅仅是一个数据容器,也可以具有行为。下面的例子就很好的展示了这一点。

@Entity(tableName = "plants")
data class Plant(
    @PrimaryKey @ColumnInfo(name = "id") val plantId: String,
    val name: String,
    val description: String,
    val growZoneNumber: Int,
    val wateringInterval: Int = 7,
    val imageUrl: String = ""
) {
    fun shouldBeWatered(since: Calendar, lastWateringDate: Calendar) =
        since > lastWateringDate.apply { add(DAY_OF_YEAR, wateringInterval) }

    override fun toString() = name
}


在这个例子里的Entity拥有行为,并且字段也可以设置默认值。

Entity告诉Room如何进行Java对象和SQL记录之间的转换。要访问数据表,我们还需要Dao。

Dao

我们还是从例子入手。

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    fun loadAllByIds(userIds: IntArray): List<User>

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND last_name LIKE :last LIMIT 1")
    fun findByName(first: String, last: String): User

    @Insert
    fun insertAll(vararg users: User)

    @Delete
    fun delete(user: User)
}


从例子里可以看到,@Query、@Insert、@Delete这几个注解将Java方法和SQL查询语句关联起来。这里的Dao是一个接口,我们不需要手动编写接口的实现类,Room会自动生成它。

如果数据量较大,查询可能会占用很多时间。为了避免ANR,我们通常需要将数据库查询放到后台进行里执行。如何将查询到的数据传递给主线程呢?Room通过LiveData实现这一点。这也是Room最好用的地方。

@Dao
interface PlantDao {
    @Query("SELECT * FROM plants ORDER BY name")
    fun getPlants(): LiveData<List<Plant>>

    @Query("SELECT * FROM plants WHERE growZoneNumber = :growZoneNumber ORDER BY name")
    fun getPlantsWithGrowZoneNumber(growZoneNumber: Int): LiveData<List<Plant>>

    @Query("SELECT * FROM plants WHERE id = :plantId")
    fun getPlant(plantId: String): LiveData<Plant>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertAll(plants: List<Plant>)
}


Database

我们已经知道Room会生成Dao的实现类。要如何得到这个类呢?答案是通过Room.databaseBuilder得到Database,在用Database得到Dao。

@Database(entities = [User::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
    abstract fun userDao(): UserDao
}

val db = Room.databaseBuilder(
    applicationContext,
    AppDatabase::class.java,
    "database-name"
).build()


Room会自动生成类,这个动作是在编译期完成的,因为我们需要引入编译插件。

apply plugin: 'kotlin-kapt'

dependencies {
    def room_version = "2.1.0-alpha04"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "android.arch.persistence.room:compiler:1.0.0"
}

© 著作权归作者所有

上一篇: 调用约定
t

tommwq

粉丝 3
博文 38
码字总数 34798
作品 0
广州
私信 提问
Android实战——Room的使用,升级没烦恼

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/qq30379689/article/details/91410223 前言 Room相比GreenDao而言是官...

Hensen_
2019/06/11
0
0
Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据

Android Room联合AsyncListUtil实现RecyclerView分页加载ORM数据 我之前写了一系列关于AsyncListUtil实现RecyclerView和ListView的分页加载机制和技术路线,见附录文章4,5。同时也写了一些列...

zhangphil
2017/11/29
0
0
Windows使用Nginx搭建RTMP服务器

简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。 nginx-rmtp-module是Nginx服务器的流媒体插件。 nginx通过rtmp模块提供rtmp服务, ffmpeg推送一个r...

凌浩雨
2018/01/17
0
0
探索Android架构组件Room

一、简介 Room是Google推出的Android架构组件库中的数据持久化组件库, 也可以说是在SQLite上实现的一套ORM解决方案。Room主要包含三个部分: Database : 持有DB和DAO Entity : 定义POJO类,即...

SuShine
2018/01/11
47
0
Android Jetpack架构组件之 Room(使用、源码篇)

1、前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面。...

SuShine
2019/02/16
477
0

没有更多内容

加载失败,请刷新页面

加载更多

IDEA 拉取、上传、更新 项目到 Gitee+GitHub_超详细超简单版

注:本人使用的idea是最新版(2019.1.2),要是其他的版本的不要惊慌〜,基本上都一样,没有什么太大的差别的 首先我要说一下,拉取项目分两个,一个,你就没有项目,拉取仓库的整个项目,而...

杨木发
今天
54
0
pyqt5环境搭建(Ubuntu19.10+pycharm+python3)

1.安装pyqt5 sudo apt-get install python3-pyqt5 sudo apt-get install qttools5-dev-tools sudo apt-get install qt5-default 2.安装pycharm 下载pycharm社区版安装包并解压 在桌面新建pyc......

小芯片
今天
54
0
Vue造轮子-tab组件(中)

1. 如果给一个标签一个class,标签本身又有class,vue是默认会合并的。只有两个属性是这样一个是class,一个是style。这样就比较好改样式。 <g-tabs-head class="red"></g-tabs> 2. 组件的...

ories
昨天
59
0
Windows 版本 Anaconda 配置加速源安装软件

C:\Users\lenovo\.condarc 首先安装Anaconda最新版本。 其次添加安装目录到环境变量。文本为 C:\ProgramData\Anaconda3\Library\bin 运行 conda 命令在 Windows 用户下生成文件 .conda...

白豆腐徐长卿
昨天
232
0
如何从Bash函数返回字符串值

我想从Bash函数返回一个字符串。 我将用Java编写示例以显示我想做的事情: public String getSomeString() { return "tadaa";}String variable = getSomeString(); 下面的示例在bash中...

javail
昨天
71
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部