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

Kotlin Multiplatform中SQL Delight插入数据时提示FavCoinData表不存在

Kotlin Multiplatform中SQL Delight插入FavCoinData表报错:表不存在

错误信息

co.touchlab.sqliter.interop.SQLiteExceptionErrorCode: error while compiling: INSERT INTO FavCoinData (...) VALUES (...) no such table: FavCoinData

其他数据库表可正常读写,多次重载项目无法解决该问题。


相关代码

Swift调用代码

for i in self.FavCoinData {
    LocalDatabase().saveFavCoinsData(
        id: i.id, name: i.name, symbol: i.symbol, image: i.image, currentPrice: i.current_price, fullyDilutedValuation: i.fully_diluted_valuation, total_volume: i.fully_diluted_valuation, high_24h: i.high_24h, low_24h: i.low_24h as? KotlinDouble, price_change_24h: i.price_change_24h as? KotlinDouble, price_change_percentage_24h: i.price_change_percentage_24h as? KotlinDouble, total_supply: i.total_supply as? KotlinDouble, max_supply: i.max_supply, last_updated: i.last_updated
    )
}

iOS端Kotlin数据库类代码

package com.example.kotlinmultiplatformapp
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.driver.native.NativeSqliteDriver
import com.crypto.database.Database
import com.crypto.database.FavCoin
import com.crypto.database.FavCoinQueries
import com.crypto.database.FavCoinData
import com.crypto.database.FavCoinDataQueries

actual class DriverFactory {
    actual fun createDriver(): SqlDriver {
        return NativeSqliteDriver(Database.Schema, "test.db")
    }
}

class LocalDatabase {
    private val driverFactory = DriverFactory()
    private val database = createDatabase(driverFactory)
    private val favCoinQueries: FavCoinQueries = database.favCoinQueries
    private val favCoinDataQueries: FavCoinDataQueries = database.favCoinDataQueries
    fun getFavCoinsData(): List<FavCoinData>{
        return favCoinDataQueries.selectAll().executeAsList()
    }
    fun saveFavCoinsData(id: String, name: String, symbol: String, image: String, currentPrice: Double,
                         fullyDilutedValuation: Double?,
                         total_volume: Double?,
                         high_24h: Double?,
                         low_24h: Double?,
                         price_change_24h: Double?,
                         price_change_percentage_24h: Double?,
                         total_supply: Double?,
                         max_supply: Double?,
                         last_updated: String){
        favCoinDataQueries.insert(id, name, symbol, image, currentPrice, fullyDilutedValuation, total_volume, high_24h, low_24h, price_change_24h, price_change_percentage_24h, total_supply, max_supply, last_updated)
    }
}

.sq表定义文件(位于sqldelight/com/crypto/database目录下)

CREATE TABLE FavCoinData (
  id TEXT PRIMARY KEY,
  symbol TEXT NOT NULL,
  name TEXT NOT NULL,
  image TEXT,
  current_price REAL NOT NULL,
  fully_diluted_valuation REAL,
  total_volume REAL,
  high_24h REAL,
  low_24h REAL,
  price_change_24h REAL,
  price_change_percentage_24h REAL,
  total_supply REAL,
  max_supply REAL,
  last_updated TEXT NOT NULL
);
selectAll:
SELECT *
FROM FavCoinData;
deleteById:
DELETE FROM FavCoinData WHERE id = ?;
insert:
INSERT INTO FavCoinData (
  id,
  symbol,
  name,
  image,
  current_price,
  fully_diluted_valuation,
  total_volume,
  high_24h,
  low_24h,
  price_change_24h,
  price_change_percentage_24h,
  total_supply,
  max_supply,
  last_updated
) VALUES (
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  ?
);

排查与解决方案

  1. 确认SQL Delight已生成包含FavCoinData的Schema
    执行./gradlew clean build清理并重新构建项目,检查生成的Database.Schema类(位于build/generated/sqldelight目录下),确认其中包含FavCoinData表的创建语句。如果没有,检查.sq文件的路径是否严格对应包名目录结构。

  2. 删除旧数据库文件
    iOS模拟器/设备中可能存在未更新的旧test.db文件,其中没有FavCoinData表。直接删除APP后重新安装,或者通过Xcode的「Devices and Simulators」找到对应APP,删除其容器文件。

  3. 添加数据库版本迁移(可选)
    为避免后续新增表出现类似问题,可在DriverFactory中指定数据库版本并添加迁移回调,确保Schema变更能正确应用:

    actual fun createDriver(): SqlDriver {
        return NativeSqliteDriver(
            schema = Database.Schema,
            name = "test.db",
            version = 2, // 版本号高于初始版本
            callback = object : SqlSchema.MigrationCallback {
                override fun onMigration(driver: SqlDriver, oldVersion: Int, newVersion: Int) {
                    // 若需手动迁移,在此编写逻辑;新增表时SQL Delight会自动处理创建
                }
            }
        )
    }
    
  4. 验证createDatabase函数的正确性
    确认createDatabase函数是通过传入的SqlDriver正确初始化了完整的Database实例,而非使用旧版本的生成代码。


内容的提问来源于stack exchange,提问作者Eliška Pavlů

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:43:14