<
Room
>
上一篇

Flutter学习笔记 动画
下一篇

Litepal

Room

graph BT;

A[接口抽象层 定义数据库 CRUD 接口]
B[接口实现层 依赖 Sqlite 能力]
C["Room 实现层(注解+编译时处理器)"]

A --> B --> C

注解 及 使用

@Entity(tableName = "book")
data class Book(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    var name: String,
    var price: Double
)
@Entity(tableName = "user")
data class User(
    @PrimaryKey val id: Long,
    val name: String
)

@Entity(tableName = "book", foreignKeys = [ForeignKey(entity = User::class, parentColumns = ["id"], childColumns = ["userId"])])
data class Book(
    @PrimaryKey val id: Long,
    val title: String,
    val userId: Long
)

data class UserWithBooks(
    @Embedded val user: User,
    @Relation(parentColumn = "id", entityColumn = "userId")
    val books: List<Book>
)

Dao

DAO 中的SQL从方法参数取参使用占位符 :id

@Dao
interface BookDao {

    @Query("SELECT * FROM book WHERE id = :id")
    fun getBookById(id: Long): Book?

    @Query("SELECT * FROM book")
    fun getAllBooks(): List<Book>

    @Insert
    fun insertBook(book: Book)

    @Update
    fun updateBook(book: Book)

    @Delete
    fun deleteBook(book: Book)

    // 删除所有
    // 使用 @Query 注解来指定 SQL 查询语句,并在查询中使用 DELETE FROM users 来删除所有用户数据
    @Query("DELETE FROM book")
    fun clearAllBooks()

}

新版的 Dao 里的方法不能加 suspend, 加了会报错 (比较),使用时直接在 Repository 层异步调用就行

数据库

@Database(entities = [Book::class], version = 1)
abstract class MyDatabase : RoomDatabase() {

    abstract fun bookDao(): BookDao

}

操作

获取 数据库 和 Dao 实例

// 初始化数据库
private val db by lazy {
    Room.databaseBuilder(
        this, MyDatabase::class.java, "my-database"
    ).build()
}

// 使用数据库
private val bookDao by lazy { db.bookDao() }

增删改查

// 插入数据
lifecycleScope.launch(Dispatchers.IO) {
    val book = Book(
        name = "Android Programming",
        price = 29.99,
    )
    bookDao.insertBook(book)
}

// 查询数据
lifecycleScope.launch(Dispatchers.IO) {
    val books = bookDao.getAllBooks()
    val text = books.joinToString(", \n") { GsonUtils.toJson(it) }
    LogUtils.e(text)
}

// 更新数据
lifecycleScope.launch(Dispatchers.IO) {
//    val book = Book(id = 2, name = "Android Programming", price = 29.99)
    val book = bookDao.getBookById(2) ?: return@launch
    book.price = 39.99
    bookDao.updateBook(book)
}

lifecycleScope.launch(Dispatchers.IO) {
    val book = Book(
        id = 1,
        name = "法外狂徒张三",
        price = 19.99,
    )
    bookDao.updateBook(book)
}

// 删除数据
lifecycleScope.launch(Dispatchers.IO) {
    val book = bookDao.getBookById(3) ?: return@launch
    bookDao.deleteBook(book)
}

lifecycleScope.launch(Dispatchers.IO) {
    bookDao.clearAllBooks()
}

实际使用时 在 repository 层调用 可以使用 viewModelScope

Top
Foot