📜  如何在 Android 中预填充房间数据库?

📅  最后修改于: 2022-05-13 01:55:04.541000             🧑  作者: Mango

如何在 Android 中预填充房间数据库?

Room 是 Android 中的 Jetpack 架构组件之一。这在 SQLite 数据库上提供了一个抽象层,用于在本地保存和执行对持久数据的操作。 Google 推荐使用 SQLite 数据库,尽管 SQLite API 更强大,但它们的级别相当低,需要花费大量时间和精力来使用。但是 Room 使创建数据库和对其执行操作的一切变得简单明了。但是预填充数据库是什么意思?预填充数据库意味着在第一次运行时在数据库中预加载一些数据。因此,我们将看到预填充 Room 数据库的实现。我们将从应用程序资产中预填充数据库。

执行

我们需要一个预先打包好的数据库,我们将其存储在android studio 的assets 文件夹中。

想要一个更快节奏和更具竞争力的环境来学习 Android 的基础知识吗?
单击此处前往由我们的专家精心策划的指南,旨在让您立即做好行业准备!

第1步:



要从存储在资产中的预打包数据库预填充房间数据库,我们需要从Room.databaseBuilder对象调用 createFromAsset() 方法。现在我们将创建数据实体。它将是一个数据类,让我们将其命名为“Quote.kt”。请参阅以下代码以供参考。

Kotlin
import androidx.room.Entity
import androidx.room.PrimaryKey
  
@Entity(tableName = "quote")
data class Quote(
    @PrimaryKey(autoGenerate = true)
    val id: Int,
    val text: String,
    val author: String
)


Kotlin
import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
  
@Dao
interface QuoteDao {
    @Insert
    suspend fun insert(quote: Quote)
  
    @Query("Select * From quote")
    fun getQuote(): LiveData>
}


Kotlin
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
  
@Database(entities = [Quote::class], version = 1)
abstract class QuoteDatabase : RoomDatabase() {
    abstract fun quoteDao(): QuoteDao
  
    companion object {
        private var INSTANCE: QuoteDatabase? = null
        fun getDatabase(context: Context): QuoteDatabase {
            if (INSTANCE == null) {
                synchronized(this) {
                    INSTANCE =
                        Room.databaseBuilder(context, QuoteDatabase::class.java, "quote_database")
                            .createFromAsset("quote.db")
                            .build()
                }
            }
            return INSTANCE!!
        }
    }
}


(autoGenerate = true) 用于在添加新数据时自动增加到 id。

第2步:

然后我们需要创建Dao。 Dao 是一个接口,所以不需要在里面定义方法。 Room 负责执行这些方法。 Dao 用于访问数据库中的数据对象。请参阅以下代码以供参考。

科特林

import androidx.lifecycle.LiveData
import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
  
@Dao
interface QuoteDao {
    @Insert
    suspend fun insert(quote: Quote)
  
    @Query("Select * From quote")
    fun getQuote(): LiveData>
}

第 3 步:

现在我们将创建数据库类,它是应用程序持久化数据的主要访问点。它是一个抽象类,它扩展到 RoomDatabase。在这里,我们在调用 build() 之前从 Room.databaseBuilder 对象调用 createFromAsset(“path”) 方法。请参阅以下代码以供参考。

科特林

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
  
@Database(entities = [Quote::class], version = 1)
abstract class QuoteDatabase : RoomDatabase() {
    abstract fun quoteDao(): QuoteDao
  
    companion object {
        private var INSTANCE: QuoteDatabase? = null
        fun getDatabase(context: Context): QuoteDatabase {
            if (INSTANCE == null) {
                synchronized(this) {
                    INSTANCE =
                        Room.databaseBuilder(context, QuoteDatabase::class.java, "quote_database")
                            .createFromAsset("quote.db")
                            .build()
                }
            }
            return INSTANCE!!
        }
    }
}

所以,这就是我们实现预填充房间持久性数据库的方式。