Jetpack Compose Desktop+SQLDelight启动报错:如何连接已存在数据库?
解决SQLDelight重复创建表导致的SQLITE_ERROR崩溃问题
问题场景
使用Jetpack Compose Desktop + SQLDelight搭建持久化POC时,首次运行成功创建database.db并存储数据,但第二次启动应用直接崩溃,抛出SQLITE_ERROR错误,提示table ArticleEntity already exists。
问题原因
初始化数据源时,每次启动都调用TestDb.Schema.create(driver)方法,该方法会直接执行建表SQL语句,当数据库中已存在对应表时,就会触发重复创建的报错。
解决方案
方式一:使用createIfNotExists避免重复建表
将create方法替换为SQLDelight提供的createIfNotExists方法,该方法会先检查表是否存在,仅在表不存在时执行建表操作:
class ArticlesLocalDataSource { private val database: TestDb init { val driver: SqlDriver = JdbcSqliteDriver(url = "jdbc:sqlite:database.db") // 替换create为createIfNotExists,避免重复建表 TestDb.Schema.createIfNotExists(driver) database = TestDb(driver) } // ... 其他业务代码 }
方式二:统一SQLDelight版本(可选)
当前构建文件中SQLDelight插件版本为1.5.3,依赖版本为1.5.4,版本不一致可能引发潜在问题,建议统一为同一版本:
plugins { kotlin("jvm") version "1.6.10" id("org.jetbrains.compose") version "1.1.0" id("com.squareup.sqldelight") version "1.5.4" } sqldelight { database("TestDb") { packageName = "com.test" } } dependencies { implementation(compose.desktop.currentOs) implementation("com.squareup.sqldelight:sqlite-driver:1.5.4") implementation("com.squareup.sqldelight:coroutines-extensions-jvm:1.5.4") }
补充说明
如果后续需要对数据库进行版本升级,可使用SQLDelight的迁移机制,通过定义Migration对象并调用Schema.migrate()方法来处理版本迭代,确保数据持久化的同时完成结构更新。
内容的提问来源于stack exchange,提问作者VCODE
相关产品推荐
相关产品推荐

