对于具有相同 CREATE 语句的两个数据库,generateSqlDelightInterface 失败

问题描述 投票:0回答:1

我的 SQLDelight Gradle 块中有两个数据库:

sqldelight {
    databases {
        create("Database") {
            packageName.set("dev.db")
        }
        create("OtherDatabase") {
            packageName.set("dev.db2")
        }
    }
}

构建后,SQLDelight 出错,没有生成 /build/sqldelight 文件夹。因为我需要两个不同的ColumnId(文件夹平台/android需要ColumnId A,/ios需要ColumnId B),所以生成两个具有相同表名、相同数据库文件名和相同包名的文件的正确方法是什么?

任务:共享:生成CommonMainDatabaseInterface失败

使用方言编译 app.cash.sqldelight.dialects.sqlite_3_18.SqliteDialect

/shared/src/commonMain/sqldelight/dev/db/Tables.sq: (1, 13): 已使用名称 user 1 CREATE TABLE user( ^^^^ 2 id 整数主键,3 名称文本 4 )

/shared/src/commonMain/sqldelight/dev/db2/Tables.sq:(1, 13): 已使用名称 user 1 CREATE TABLE user 定义表( ^^^^ 2 id 整数主键,3 名称文本 4 )

失败:构建已完成,但有 2 次失败。

1:任务因异常而失败。

出了什么问题: 任务“:shared:generateCommonMainDatabaseInterface”执行失败。 执行 app.cash.sqldelight.gradle.SqlDelightTask$GenerateInterfaces 时出错 生成失败;有关详细信息,请参阅生成器错误输出。

2:任务因异常而失败。

出了什么问题: 任务“:shared:generateCommonMainOtherDatabaseInterface”执行失败。 执行 app.cash.sqldelight.gradle.SqlDelightTask$GenerateInterfaces 时出错 生成失败;有关详细信息,请参阅生成器错误输出。

3秒内构建失败 2 个可操作的任务:已执行 2 个

构建.gradle:

sqldelight {
    databases {
        create("Database") {
            packageName.set("dev.db")
        }
        create("OtherDatabase") {
            packageName.set("dev.db2")
        }
    }
}

*.sq 文件:

CREATE TABLE IF NOT EXISTS user(
_ID INTEGER PRIMARY KEY AUTOINCREMENT,
CATEGORY_ID INTEGER NOT NULL UNIQUE,
);

构建系统:

  • SQLDelight 2.0.2
  • 摇篮8.9
  • 科特林 2.0.20
  • 方言 SQLite
kotlin sqlite kotlin-multiplatform sqldelight
1个回答
0
投票

简单的方法:

尝试使用“重命名列”SQL 查询更改为相同的 ColumnId(在 Android 或 iOS 端,使用重命名 SQL 查询运行数据库迁移)。

进阶方式:

在“KMP”根项目必须创建两个“/module”文件夹:

  • /iOsDbMobule:
    • 照常定义这些文件夹:/iosMain、/commonMain。
    • 配置/设置sqlDelight生成A.db(包括ColumnId AA)。
  • /androidDbModule:
    • 照常定义这些文件夹:/androidMain、/commonMain。
    • 配置/设置sqlDelight生成A.db(包括ColumnId BB)。

构建(运行配置)后重新检查其是否有效(在文件夹 /generate...*.sqldelight 中)。在本机项目中进行验证:

  • iOS端:从“KMP prj”导入*.xcframework,它将模拟到相应的类/数据库文件(带有columId AA)。
  • Android端:从“KMP prj”导入*.aar,它将模拟到相应的类/数据库文件(带有columId BB)。
© www.soinside.com 2019 - 2024. All rights reserved.