我正在try 学习如何在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数据库,这些数据将在应用程序运行时被访问.

我试图找到一些关于如何继续这方面的指导,但未能找到一个我可以遵循的资源.

推荐答案

我想问我如何使用这个模式来创建一个数据库文件并预填充它.

最简单的方法,而不是试图解释保存的模式,是让Room通过以下方式来解释:

  1. 成功编译项目
  2. 在Android Studio的Android View中找到java(generated)文件夹/目录
  3. 在java(generated)文件夹中找到与@Database注释类(LocationDatabase in you case)同名的类,但后缀为_Impl(In your case 102).
  4. 找到createAllTables方法,这将有一行代码执行SQL以创建所有表.这个SQL正是Room所期望的,并且可以复制到您用来构建预打包数据库的任何工具中.
  5. 填充并保存为单个文件后,您可以将该文件复制到assets资源 文件夹(您可能需要创建该文件)
    1. (如果是—wal文件,则数据库尚未关闭,您需要正确关闭数据库,例如使用Navicat,您必须关闭应用程序)
  6. 然后在databaseBuilder调用中包括createFromAsset方法

You may wish to refer to How to prepopulate database using Room? I don't see tutorials that explains in details using java which covers the steps in more detail.

Android相关问答推荐

在编写中强制软键盘呈现

垂直居中图标

Jetpack编写:通过viewModels()vs viewModel View ModernName()'

错误:无法解析Symbol@style/Theme. Androidstudio in AndroidManifest.html for Kotlin Android Development''

Jetpack Compose-如何使用值动画直接控制其他动画

Composable不会以LocalConext.Current作为活动呈现

使用Kotlin/Compose与Java/XML指南的比较

Android Compose Pages 3-一次加载所有页面,无需在LazyColumn中滚动,无需网络调用和内部滚动

如何使用进度条和返回函数进行API调用,同时在Android上使用Kotlin保持高效?

Play Google上发布的一款应用的房间数据库迁移

插入视图模型时,dagger 未命中绑定错误

如何在另一个函数中初始化主类参数? (我是初学者)代码推荐

DatePickerDialog (Android/Kotlin) 的两个问题

如何像 XML 一样在 Compose Android Studio 中折叠/展开小部件代码区域/区域

如何在 Jetpack Compose 中禁用 Horizo​​ntalPager 的分页动画

Android:appcompat 和 material 如何从默认创建 appcompat 和 material 视图?

插入查询室 OnConflictStrategy.REPLACE

构成material 3 中的分隔符

compose FontFamily 错误:必须初始化变量

compose :为什么以记住启动的列表触发方式与快照不同