Android架构组件Room的使用

117 阅读1分钟

"room.expandProjection":"true"]

}

}

}

}

定义数据表

创建图书表

@Entity(tableName = "book")

class Book {

@PrimaryKey(autoGenerate = true)

var id: Int = 0

@ColumnInfo(name = "bookname")

var name: String? = ""

constructor(bookname: String?) {

this.name = bookname

}

}

表注解解释

1.如果想给一个表设置表名就在@Entity的后面添加(tableName = “book”),不是设置默认采用类名

2.声明表的主键 @PrimaryKey(autoGenerate = true)

3.更改表的属性列名@ColumnInfo(name = “bookname”),默认类的字段名

1.定义Dao类

@Dao

interface BookDao {

@Insert

fun addBook(book : Book)

@Query("SELECT * FROM book")

fun loadAll(): List<Book?>?

@Query("select * from book where name = :name")

fun queryName(name : String) :List<Book?>?

@Delete

fun delete(song: Book?)

}

如果在query时返回值类型和查询的表名和返回值类型或查询的表名不相同时,在程序编译会编译失败,这也降低了程序在运行时出现的风险

2.定义数据库和生成数据类

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

abstract class RoomDaoManager : RoomDatabase() {

abstract fun BookDao(): BookDao

companion object {

private val DATABASE_NAME = "dev_db.db"

private var databaseInstance: RoomDaoManager? = null

@Synchronized

open fun getInstance(): RoomDaoManager? {

if (databaseInstance == null) {

databaseInstance = Room

.databaseBuilder(

MyApplication.instance(),

RoomDaoManager::class.java,

DATABASE_NAME

)

.allowMainThreadQueries()

.build()

}

return databaseInstance

}

}

}

数据库升级

1.addMigrations(Migration migrations…):一个迁移可以处理多个版本

2.Migration(int startVersion, int endVersion):每次迁移都可以在定义的两个版本之间移动,初始版本和目标版本

3.在重写的migrate方法中执行更新的sql,同时需要在对应的Entity类中添加相同的字段,来保证字段相同

Room .databaseBuilder(

MyApplication.instance(),

RoomDaoManager::class.java,

DATABASE_NAME

)

.allowMainThreadQueries()

.addMigrations(MIGRATION_1_2)

.build()

###addMigrations(Migration migrations...):一个迁移可以处理多个版本

###Migration:每次迁移都可以在定义的两个版本之间移动

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

override fun migrate(database: SupportSQLiteDatabase) {

//对表增加一个字段

database.execSQL("ALTER TABLE Book ADD COLUMN sn TEXT NOT NULL DEFAULT ''")

}

}

LiveData和Room配合使用

//Livedata依赖

def lifecycle_version = "2.2.0"

implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"

//返回值使用Livedata

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

fun queryLiveData(id : Int): LiveData<Book?>?

//通dao对象调用查询的方法

bookDao?.queryLiveData(1)?.observe(this, Observer {

Log.i("book-query","${it?.name}")

})

Rxjava和Room配合使用

//Rxjava2和Rxjava3 可以选择使用

def room_version = "2.3.0"

// optional - RxJava2 support for Room

implementation "androidx.room:room-rxjava2:$room_version"

// optional - RxJava3 support for Room

implementation "androidx.room:room-rxjava3:$room_version"