在Android应用程序上使用Room数据库时,是否可以预填充数据

问题描述 投票:0回答:1

我正在尝试学习如何在 Android 应用程序中使用 Room 来存储本地数据。我尝试按照以下说明进行操作:https://developer.android.com/training/data-storage/room

我设法让一个简单的应用程序运行起来,其中数据库定义为:

@Database(entities = [Location::class], version = 1, exportSchema = true)
abstract class LocationDatabase : RoomDatabase() {
    abstract fun locationDAO(): LocationDAO
    companion object {
        @Volatile
        private var INSTANCE: LocationDatabase? = null
        fun getDatabase(context: Context): LocationDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    LocationDatabase::class.java,
                    "location_database"
                )
                    .fallbackToDestructiveMigration()
                    .build()
                INSTANCE = instance
                instance
            }
        }
    }
}

通过在应用程序级别 build.gradle.kts 文件中包含以下内容,我可以在构建项目时提取数据库的架构。

ksp {
            arg("room.schemaLocation", "$projectDir/schemas")
        }

我想问如何使用此架构来创建数据库文件并预填充它,然后在创建应用程序时可以将其用作内容源。我想要完成的是用一些数据预先填充 Room 数据库,这些数据将在应用程序运行时访问。

我尝试找到一些有关如何继续此操作的指南,但未能找到我可以遵循的资源。

android kotlin sqlite android-room
1个回答
0
投票

我想问如何使用此架构来创建数据库文件并预填充它。

最简单的方法是让 Room 通过以下方式进行解释:

  1. 项目编译成功
  2. 从 Android Studio 的 Android 视图中找到 java(生成的)文件夹/目录
  3. 在 java(生成)文件夹中找到与
    @Database
    带注释的类同名的类(在您的情况下是LocationDatabase),但后缀为 _Impl (在您的情况下是
    LocationDatabase_Impl
    )。
  4. 找到
    createAllTables
    方法,其中有一行代码执行SQL来创建所有表。此 SQL 正是 Room 所期望的,并且可以复制到您用来构建预打包数据库的任何工具。
  5. 填充并保存为单个文件后,您可以将文件复制到资产文件夹中(您可能需要创建该文件夹)
    1. (如果是 -wal 文件,则数据库尚未关闭,您需要正确关闭数据库,例如使用 Navicat,您必须关闭应用程序)
  6. 然后,您可以在 databaseBuilder 调用中包含
    createFromAsset
    方法
© www.soinside.com 2019 - 2024. All rights reserved.