android room数据库embed,Android room数据库基操

写这篇博客的一部分原因来自一位安卓大佬的嘲讽:

c89ae27920bd

嘲讽

这个能忍?不能!

1、这篇文章将介绍Room的基本用法

c89ae27920bd

基本用法

2、room的组成和简单介绍

一般情况下,如果要使用room,一般要了解room的几个组成部分:

2.1、RoomDatabase

数据库的主要核心类

在代码中用注解@Database表示。

2.2、Entity

数据库的表

在代码中用注解@Entity表明该类为数据库表,比如以下这段代码:。

@Entity

data class User(

var id: Int,

var name: String,

var gender: Int

)

表名为:User,里面的字段id、name等等都是这个User表的字段。还有其他的一些注解标明那个字段的一些属性,比如标明id为主键@PrimaryKey var id: Int,。

2.3、Dao

操作数据表的类

可以简单的理解为:这个里面写了对表的增删改查的方法。通过注解标明方法的作用,比如:

@Dao

interface UserDao {

@Query("SELECT * FROM user")

fun getUsers(): Single>

@Query("SELECT * FROM user where id=:id")

fun getUserById(id: Int): User

@Insert

fun insertUser(user: User):Long

@Update

fun updateUser(user: User):Int

@Delete

fun deleteUser(user:User):Int

}

@Query:为查询表中的数据的意思

@Update:修改的表中的数据的意思

@Insert:插入新的表数据

@Delete: 删除表的数据

3、使用room数据库

3.1、添加依赖

在app的build.gradle中添加以下依赖

implementation "androidx.room:room-runtime:2.2.3"

implementation "androidx.room:room-ktx:2.2.3"

implementation "androidx.room:room-rxjava2:2.2.3"

kapt 'androidx.room:room-compiler:2.2.5'

3.2、添加RoomDatabase

@Database(entities = [User::class],version = 1)

abstract class AppDataBase : RoomDatabase() {

companion object{

private var instance:AppDataBase? = null

fun getInstance(context: Context):AppDataBase{

if(instance == null){

synchronized(AppDataBase::class){

instance = Room.databaseBuilder(context,AppDataBase::class.java,"app_db")

.allowMainThreadQueries()

.build()

}

}

return instance!!

}

}

}

3.3、添加Entity

@Entity

data class User(

@PrimaryKey

var id: Int,

var name: String,

var gender: Int

)

3.4、添加Dao

@Dao

interface UserDao {

@Query("SELECT * FROM user")

fun getUsers(): Single>

@Query("SELECT * FROM user where id=:id")

fun getUserById(id: Int): User

@Insert

fun insertUser(user: User):Long

@Update

fun updateUser(user: User):Int

@Delete

fun deleteUser(user:User):Int

}

4、简单的实战

任何东西都是从简到难的,做一个非常简单的“用户管理系统”实现最简单的用户增删改查的方法。这边涉及到常用的增删改查的基本操作。

c89ae27920bd

示例效果

代码在文章最后!

5、数据库升级

数据库升级在每一个版本上新的时候会经常遇到,一般是表字段进行了修改。一般新增一些字段的情况比较多。以下四步是完成数据库升级的基本步骤。

5.1、添加Entity字段

原Entity

@PrimaryKey

var id: Int,

var name: String,

var gender: Int

)

添加一个String类型的字段:

@Entity

data class User(

@PrimaryKey(autoGenerate = true)

var id: Int,

var name: String?,

var gender: Int,

var hobby:String?

)

5.2、修改AppDataBase的版本号

原来的版本号:

@Database(entities = [User::class], version = 1)

修改后的版本号:

@Database(entities = [User::class], version = 2)

注意:version的版本号要和下面提到的MIGRATION要对应上!

5.3、添加MIGRATION

添加一个MIGRATION,并且添加上修改数据库表字段的sql代码:

private val MIGRATION_1_2 = object : Migration(1, 2) {

override fun migrate(database: SupportSQLiteDatabase) {

database.execSQL("ALTER TABLE User ADD COLUMN hobby TEXT")

}

}

注意: Migration(1, 2)代表数据库版本从1升级到2,和前一步修改数据库版本对应。

5.4、将添加的MIGRATION添加到数据构造中去

fun getInstance(context: Context): AppDataBase {

if (instance == null) {

synchronized(AppDataBase::class.java) {

instance = Room.databaseBuilder(

context.applicationContext,

AppDataBase::class.java,

"app_db"

)

// MIGRATION添加到这里

.addMigrations(MIGRATION_1_2)

.allowMainThreadQueries()

.build()

}

}

return instance!!

}

// MIGRATION

private val MIGRATION_1_2 = object : Migration(2, 3) {

override fun migrate(database: SupportSQLiteDatabase) {

database.execSQL("ALTER TABLE User ADD COLUMN hobby TEXT")

}

}

如果有多个MIGRATION则往后添加:

.addMigrations(MIGRATION_1_2, MIGRATION_3_4, MIGRATION_4_5, MIGRATION_5_6, MIGRATION_6_7)

以上就是room数据库的基本使用了,当了解一些基本的流程之后,实际上使用起来还是比较简单的。

6、遇到的一些问题

这边是我使用room遇到的一些问题了。

编译通不过

c89ae27920bd

编译错误

从网上查过是少了一个依赖:

kapt 'android.arch.persistence.room:compiler:1.1.1'

检查下所有的依赖是不是都在:

implementation "androidx.room:room-runtime:2.2.3"

implementation "androidx.room:room-ktx:2.2.3"

implementation "androidx.room:room-rxjava2:2.2.3"

kapt 'android.arch.persistence.room:compiler:1.1.1'

升级数据库时Kotlin和java的int是否可以为空的问题

如果第一次使用room。说不定会遇到。

如果使用kotlin的?:

Int?

那么升级数据时要加上DEFAULT 0

database.execSQL("ALTER TABLE User ADD COLUMN gender INTEGER DEFAULT 0");

如果Koltin不用?那就不需要加DEFAULT 0。

如果用的是java,那么所有的加上DEFAULT 0就不会出问题。

7、示例源码

c89ae27920bd

image.png

master是升级前的代码,master-update是升级后的代码。代码是Kotlin版本。

本博客为简书个人原创,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值