KMM中SQLDelight多表创建与初始化插入问题求助
KMM中SQLDelight无法创建Settings表及初始化数据的解决方案
问题1:创建Settings表
你的Settings表未被创建,核心原因是SQLDelight未识别到新增的建表语句或未更新生成的数据库schema,按以下步骤修复:
- 确认建表语句正确性:你当前的
CREATE TABLE Settings语句语法无误,无需修改。 - 重新构建项目:SQLDelight依赖代码生成机制,新增表后需执行
Build -> Clean Project,再执行Build -> Rebuild Project,触发SQLDelight重新生成包含Settings表的数据库schema。 - 验证SQLDelight配置:在common模块的
build.gradle.kts中确认配置路径正确,示例如下:
sqldelight { database("AppDatabase") { packageName = "com.yourpackage.db" // 替换为你的实际包名 // 确保schema目录指向存放.sq文件的路径,默认是src/commonMain/sqldelight } }
问题2:数据库创建时自动插入初始化数据
SQLDelight不会自动执行.sq文件中的INSERT语句,可通过两种方式实现初始化插入:
方式1:利用数据库迁移(推荐)
- 在SQLDelight schema目录下创建迁移文件夹,例如
src/commonMain/sqldelight/com/yourpackage/db/AppDatabase/migrations - 创建对应版本的迁移文件(如
1.sq),写入建表和插入语句:
CREATE TABLE Settings ( version TEXT NOT NULL ); INSERT INTO Settings(version) VALUES ('1.0.0');
- 在
build.gradle.kts中配置迁移目录:
sqldelight { database("AppDatabase") { packageName = "com.yourpackage.db" migrationDirectory = file("src/commonMain/sqldelight/com/yourpackage/db/AppDatabase/migrations") } }
数据库初始化时会自动执行该迁移脚本,完成表创建与数据插入。
方式2:数据库初始化后手动执行插入
- 在
AppDatabase.sq中新增插入语句定义:
insertSettings: INSERT INTO Settings(version) VALUES (?);
- 在数据库创建逻辑中,检查
Settings表是否已有数据,若无则执行插入:
val database = AppDatabase(driver) // 查询是否存在版本数据 val existingVersion = database.getVersion().executeAsOneOrNull() if (existingVersion == null) { database.transaction { database.insertSettings("1.0.0") } }
内容的提问来源于stack exchange,提问作者LiTTle
相关产品推荐
相关产品推荐

