You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:05:31