Sqldelight: Error while importing the generated database

Created on 22 Aug 2020  路  13Comments  路  Source: cashapp/sqldelight

Build Environment
SQLDelight version: 1.4.1
OS: macOS 10.15.6
Gradle version: 6.6
Kotlin version: 1.4.0
IDE: Android Studio 4.0.1 and IntelliJ IDEA 2020.2
AGP Version (if applicable): 4.0.1

Describe the bug
After migrating and building my project, I can not import the generated database from the commonMain nor androidMain source sets. However, I can import it from the iosMain source set.

When I try to import the database from the commonMain source set, the IDE says "Add dependency on module 'common_iosMain'". Similarly, on the androidMain source set, it says "Add dependency on on module 'common_iosMain'" and "Import", but the option "Import" does not work.

Common target

Android target

Additionally, after building, the IDE gives a warning:

Duplicate content roots detected: Path [/Users/Gianfranco/Documents/UPC-Mobile/common/build/generated/sqldelight/code/UpcDatabase] of module [common_iosMain] was removed from modules [common_commonMain]

build.gradle

plugins {
    kotlin("multiplatform")
    kotlin("native.cocoapods")
    kotlin("plugin.serialization")
    id("com.android.library")
    id("com.squareup.sqldelight")
}

android {
    compileSdkVersion(App.CompileSdk)
    buildToolsVersion(App.BuildTools)

    defaultConfig {
        minSdkVersion(App.MinSdk)
        targetSdkVersion(App.TargetSdk)
        versionCode = App.VersionCode
        versionName = App.VersionName
    }

    sourceSets {
        getByName("main") {
            manifest.srcFile(File("src/androidMain/AndroidManifest.xml"))
            java.srcDirs("src/androidMain/kotlin")
            res.srcDirs("src/androidMain/res")
        }

        getByName("test") {
            java.srcDirs("src/androidTest/kotlin")
            res.srcDirs("src/androidTest/res")
        }
    }
}

sqldelight {
    database("UpcDatabase") {
        packageName = "com.upc.common.sqldelight"
    }
}

version = "1.0"

kotlin {
    android()

    val onPhone = System.getenv("SDK_NAME")?.startsWith("iphoneos") ?: false
    if (onPhone) {
        iosArm64("ios")
    } else {
        iosX64("ios")
    }

    sourceSets["commonMain"].dependencies {
        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.Coroutines}")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:${Versions.Serialization}")
        implementation("io.ktor:ktor-client-core:${Versions.Ktor}")
        implementation("com.squareup.sqldelight:coroutines-extensions:${Versions.SqlDelight}")
        implementation("com.russhwolf:multiplatform-settings:${Versions.Settings}")
    }

    sourceSets["androidMain"].dependencies {
        implementation("io.ktor:ktor-client-android:${Versions.Ktor}")
        implementation("com.squareup.sqldelight:android-driver:${Versions.SqlDelight}")
    }

    sourceSets["iosMain"].dependencies {
        implementation("io.ktor:ktor-client-ios:${Versions.Ktor}")
        implementation("com.squareup.sqldelight:native-driver:${Versions.SqlDelight}")
    }

    sourceSets["commonTest"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-test-common:${Versions.Kotlin}")
        implementation("org.jetbrains.kotlin:kotlin-test-annotations-common:${Versions.Kotlin}")
    }

    sourceSets["androidTest"].dependencies {
        implementation("org.jetbrains.kotlin:kotlin-test:${Versions.Kotlin}")
        implementation("org.jetbrains.kotlin:kotlin-test-junit:${Versions.Kotlin}")
        implementation("com.squareup.sqldelight:sqlite-driver:${Versions.SqlDelight}")
    }

    targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
        binaries.withType<org.jetbrains.kotlin.gradle.plugin.mpp.Framework> {
            isStatic = false
        }
    }

    cocoapods {
        summary = "UPC-Mobile with Kotlin/Native"
        homepage = "https://github.com/GianfrancoMS/UPC-Mobile"
        podfile = project.file("../iosApp/Podfile")
    }
}

tasks.getByName("podspec").enabled = false

gradle.properties

org.gradle.jvmargs=-Xmx1536m
org.gradle.caching=true
android.useAndroidX=true
android.useMinimalKeepRules=true
kotlin.incremental.usePreciseJavaTracking=true
kotlin.code.style=official
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
xcodeproj=./iosApp
bug

Most helpful comment

please try latest snapshot release to see if it fixes

All 13 comments

Probably related to #1880

From kotlinlang.org:

Libraries published with the hierarchical project structure are compatible with all kinds of projects, both with and without the hierarchical project structure. However, libraries published without the hierarchical project structure can鈥檛 be used in a shared native source set. So, for example, users with ios() shortcuts in their gradle.build files won鈥檛 be able to use your library in their iOS-shared code.

Same here. When I set enableGranularSourceSetsMetadata to false, it however compiles fine but shows warnings in the IDE that the database is not resolved.

Same problem. I had to temporarily downgrade Kotlin to 1.3.72 and SQLDelight to 1.4.0 and wait for library fixes.

please try latest snapshot release to see if it fixes

I can check

I can confirm that I'm no longer seeing the issue in my project. 馃帀

That's quite some issue for us as well (also cf. #1906). :(

Any change we can see this thingy released without the need to wait for the current milestone 1.4.2 to be finished? 馃殌

@benjohnde you can use 1.5.0-SNAPSHOT in the meantime.

Oweeee that's so perfect :) Thanks @saket 鉂わ笍

@AlecStrong @saket how do I access 1.5.0-SNAPSHOT, I am currently having the same issue

It looks like 1.4.2 has been released, which includes the fix. So no need for snapshot and the snapshot repo

I'm still having this with 1.4.4.

With:

kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false

I have a database' module where the sqldelight database gets generated and it gets consumed by another module. After the very first build, the database fails to resolve: ./gradlew database:clean && ./gradlew consumer:buildthe database does not exist. When I run another./gradlew consumer:build`, the database gets is there.

When I set enableGranularSourceSetsMetadata to false, it works on the first build.

Was this page helpful?
0 / 5 - 0 ratings