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 ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? );
排查与解决方案
确认SQL Delight已生成包含FavCoinData的Schema
执行./gradlew clean build清理并重新构建项目,检查生成的Database.Schema类(位于build/generated/sqldelight目录下),确认其中包含FavCoinData表的创建语句。如果没有,检查.sq文件的路径是否严格对应包名目录结构。删除旧数据库文件
iOS模拟器/设备中可能存在未更新的旧test.db文件,其中没有FavCoinData表。直接删除APP后重新安装,或者通过Xcode的「Devices and Simulators」找到对应APP,删除其容器文件。添加数据库版本迁移(可选)
为避免后续新增表出现类似问题,可在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会自动处理创建 } } ) }验证createDatabase函数的正确性
确认createDatabase函数是通过传入的SqlDriver正确初始化了完整的Database实例,而非使用旧版本的生成代码。
内容的提问来源于stack exchange,提问作者Eliška Pavlů
相关产品推荐
相关产品推荐

