如何在 Android 中预填充房间数据库?
Room 是 Android 中的 Jetpack 架构组件之一。这在 SQLite 数据库上提供了一个抽象层,用于在本地保存和执行对持久数据的操作。 Google 推荐使用 SQLite 数据库,尽管 SQLite API 更强大,但它们的级别相当低,需要花费大量时间和精力来使用。但是 Room 使创建数据库和对其执行操作的一切变得简单明了。但是预填充数据库是什么意思?预填充数据库意味着在第一次运行时在数据库中预加载一些数据。因此,我们将看到预填充 Room 数据库的实现。我们将从应用程序资产中预填充数据库。
执行
我们需要一个预先打包好的数据库,我们将其存储在android studio 的assets 文件夹中。
第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!!
}
}
}
所以,这就是我们实现预填充房间持久性数据库的方式。