首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLDelight:[SQLITE_ERROR] SQL错误或缺少数据库(表已经存在)

SQLDelight:[SQLITE_ERROR] SQL错误或缺少数据库(表已经存在)
EN

Stack Overflow用户
提问于 2022-11-12 13:07:50
回答 1查看 23关注 0票数 0

我正在尝试用JetpackCompose、、桌面、和SQLDelight构建一个小型POC。我希望即使在重新启动应用程序之后(不仅是在内存中,正如我遇到的所有教程示例所显示的那样),数据仍然持久化,所以我尝试了如下:

代码语言:javascript
复制
// ArticlesLocalDataSource.kt

class ArticlesLocalDataSource {
    private val database: TestDb

    init {
        val driver: SqlDriver = JdbcSqliteDriver(url = "jdbc:sqlite:database.db")
        TestDb.Schema.create(driver)

        database = TestDb(driver)
    }

    // ...
}

当我第一次运行应用程序时,即创建项目根目录中的database.db文件并成功地存储数据。

但是,当我第二次尝试运行应用程序时,它会立即崩溃:

代码语言:javascript
复制
Exception in thread "main" org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (table ArticleEntity already exists)
    at org.sqlite.core.DB.newSQLException(DB.java:1012)
    at org.sqlite.core.DB.newSQLException(DB.java:1024)
    at org.sqlite.core.DB.throwex(DB.java:989)
    at org.sqlite.core.NativeDB.prepare_utf8(Native Method)
    at org.sqlite.core.NativeDB.prepare(NativeDB.java:134)
    at org.sqlite.core.DB.prepare(DB.java:257)
    at org.sqlite.core.CorePreparedStatement.<init>(CorePreparedStatement.java:45)
    at org.sqlite.jdbc3.JDBC3PreparedStatement.<init>(JDBC3PreparedStatement.java:30)
    at org.sqlite.jdbc4.JDBC4PreparedStatement.<init>(JDBC4PreparedStatement.java:25)
    at org.sqlite.jdbc4.JDBC4Connection.prepareStatement(JDBC4Connection.java:35)
    at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:241)
    at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:205)
    at com.squareup.sqldelight.sqlite.driver.JdbcDriver.execute(JdbcDriver.kt:109)
    at com.squareup.sqldelight.db.SqlDriver$DefaultImpls.execute$default(SqlDriver.kt:52)
    at com.vgrec.TestPlus.TestDbImpl$Schema.create(TestDbImpl.kt:33)
    at com.vgrec.data.local.ArticlesLocalDataSource.<init>(ArticlesLocalDataSource.kt:20)

我知道它正在崩溃,因为有人试图再次创建数据库,但是数据库已经存在了。我不清楚的是,如果数据库已经存在,如何连接到DB?

为了完整起见,下面是构建文件:

代码语言:javascript
复制
// build.gradle


plugins {
    kotlin("jvm") version "1.6.10"
    id("org.jetbrains.compose") version "1.1.0"

    // ...
    id("com.squareup.sqldelight") version "1.5.3"
    
}

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")
}
EN

回答 1

Stack Overflow用户

发布于 2022-11-12 14:05:57

好的,最后我决定只检查数据库文件是否存在,只有当它不存在时才调用创建。

就像这样:

代码语言:javascript
复制
init {
  val driver: SqlDriver = JdbcSqliteDriver("jdbc:sqlite:database.db")

  if (!File("database.db").exists()) {
      TestDb.Schema.create(driver)
  }

  // ...
 
}

乍一看,这似乎像预期的那样起作用,但我不确定这是推荐的方法,因为我对SQLDelight非常陌生,因此欢迎其他建议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74413198

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档