视图是一个或者多个基本表(视图)构建的一个虚拟表,使用视图有许多的好处,其中主要的两个好处是封装查询和灵活的安全性控制。Room 从2.1.0 及更高版本开始支持 SQLite 数据库视图功能,你可以将查询封装到一个类中, Room 将这些支持查询的类称之为视图,视图在 DAO 中使用跟普通的数据实体对象一样。更多关于视图的相关内容大家可以自行学习,在本篇幅,我们将详细介绍在 Room 中创建视图并使用。
注意事项:跟数据实体类一样,你可以在视图中执行
SELECT
查询语句,但是你无法在视图中执行
INSERT
、
UPDATE
、
DELETE
语句。换句话说,视图只有读权限,没有写权限,这就是安全性控制的一个特点。
Room 创建视图非常简单,定义一个数据类(跟数据实体类一样,不过对应的是视图,不是实体表),使用
@DatabaseView
注解进行标注,
@DatabaseView
有两个参数,一个是
viewName
(自定义视图名称,可选),另一个是
values
(视图数据对应的 SQL 查询语句)。如下示例所示:
@Entity(tableName = "schools")
data class School(@PrimaryKey val sid: Int, val name: String, val addr: String)
@Entity(tableName = "students")
data class Student(@PrimaryKey val sid: Int, val name: String, val age: Int, val schoolId: Int, val addr: String?)
@DatabaseView("SELECT students.sid, students.name, students.age, " +
"schools.sid AS schoolId, schools.name AS schoolName " +
"FROM students INNER JOIN schools ON students.schoolId = schools.sid")
data class StudentWithSchool(
val sid: Int,
val name: String,
val age: Int,
val schoolId: Int,
val schoolName: String)
创建了视图类之后,需要在数据库定义时声明视图类。在 @Database
注解中的 views
参数进行声明,如下示例所示:
@Database(
entities = [User::class, School::class, Student::class, Profile::class],
views = [StudentWithSchool::class],
version = 1)
abstract class AppDatabase: RoomDatabase() {
abstract fun studentDao(): StudentDao
在 DAO 类中添加查询视图方法,即可从视图中查询数据。
interface StudentDao {
@Insert
fun insertAll(vararg student: Student)
@Insert
fun insertSchool(vararg schools: School)
@Query("SELECT * from StudentWithSchool")
suspend fun getStudentWithSchool() : List<StudentWithSchool>
注意事项:视图表只能执行 SELECT
查询操作,不能执行 INSERT
、UPDATE
、DELETE
操作。
视图是一个虚拟表,所以在数据库升级迁移时,视图发生变更(新增、删除、修改等)时,也需要进行处理。数据库迁移相关可请参考文章:Android Room 数据库详解。下面通过示例介绍下数据库迁移时视图的处理。
@Database(entities = [User::class, School::class, Student::class, Profile::class], version = 1)
abstract class AppDatabase: RoomDatabase() {
abstract fun studentDao(): StudentDao
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app.db")
.build()
@Database(entities = [User::class, School::class, Student::class, Profile::class], views = [StudentWithSchool::class], version = 2)
abstract class AppDatabase: RoomDatabase() {
abstract fun studentDao(): StudentDao
val migration_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE VIEW `StudentWithSchool` AS SELECT students.sid, students.name, students.age, schools.sid AS schoolId, schools.name AS schoolName FROM students INNER JOIN schools ON students.schoolId = schools.sid")
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app.db")
.addMigrations(migration_1_2)
.build()
示例讲解:上面的示例中,数据库迁移过程中新增一个视图,在迁移配置中必须手动创建一个视图。跟数据表一样,在 @Database
中声明的视图类,只会在第一次安装创建数据库时才会创建视图,后续添加的必须进行数据库迁移操作。创建视图使用 CREATE VIEW
语法(更多 SQL 语法大家自行学习),不过笔者发现一个很有趣的现象,SQL 语句创建视图时,视图名称直接用字符窜表示即可,但是在 Room 的数据库迁移配置中,必须使用两个半角的间隔号(就是键盘上方 1 数字键左边的那个按键,并不是单引号,这个需要特别注意)。
是一个持久性库,属于 Android的一部分。Room 是数据库之上的一个抽象层。SQLite 使用一种专门的语言 (SQL) 来执行数据库操作。Room 并不直接使用 SQLite,而是负责简化数据库设置和配置以及与数据库交互方面的琐碎工作。此外,Room 还提供 SQLite 语句的编译时检查。
文章目录1. 为什么要使用 Room?2. 通过一个案例,介绍如何使用 Room2.1 数据库 ER 图2.2 添加 Room 的依赖2.3 创建实体2.4 创建 Dao2.5 创建数据库2.6 封装 Repository2.7 类型转换器@TypeConverter2.8 数据库迁移 Migration2.9 数据库的测试3. 分析 Room 的组成及使用原理4. 总结一下 Room 的使用参考...
安卓jetpack 的room数据库框架是基于Sqlite3的数据库,但是有别于sqlite,因此使用查看sqlite的数据库可视化软件看不到room的数据库的值(但是可以打开),
使用Androidstudio自带的databaseinspector,高版本的AS需要在APP inspection里面打开,另外应用必须是debug版本
版权声明:本文为博主原创文章,欢迎大家转载!
但是转载请标明出处: https://blog.csdn.net/t000818/article/details/84289212 ,本文出自:【唐宏宇的博客】
在Room persistence library 的2.1.0及更高版本中提供了对SQLite数据库视图的支持,允许将查询封装到类中。 Room将这些查询支持的类称为视图,使用它们时和D...
一: 使用 Room 将数据保存到本地数据库
注:本文摘自安卓开发文档,仅供学习使用,链接如下:安卓开发文档ROOM
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。
处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备之后重新连接到网络后,用户发起的所有内容更改都会同步到服务器。
*注意:要在应用中使用 Room,请在应用的 build.
一.Room简介
Room是Google推出的数据库框架,是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 使用ORM可以让开发者更加关注业务逻辑,而不是SQL 语句。在JavaWeb领域也有类似的ORM 数据库框架Hibernate、MyBatis等等。
1.Android平台数据库框架
在 Android 中常见的数据库框架:
Greendao
Realm
DBFlow
LitePal
Jetpack-Room
翻译至:Android Room with a View - Java
架构组件的目的是提供对应用程序体系结构的指导,并为诸如生命周期管理和数据持久化等常见任务提供开发库。
架构组件帮你构造一个鲁棒、易测试、可维护和少模板代码的应用。
架构组件是什么?
为了介绍相关术语,这里有简短的介绍一下各架构组件以及它们之前如...