मेरे पास एक केएमएम प्रोजेक्ट है और मैं SqlDelight लाइब्रेरी का उपयोग करना चाहता हूं, लेकिन जब मैं प्रोजेक्ट डेटाबेस स्कीमा बनाता हूं तो जेनरेट नहीं होता है और टेबल इकाइयां भी होती हैं।

actual class DatabaseDriverFactory(private val context: Context) {
    actual fun createDriver(): SqlDriver {
               //Unresolved reference: CoreDb
        return AndroidSqliteDriver(CoreDb.Schema, context, "test.db")
    }
}

मैंने अपने साझा मॉड्यूल के अंदर sqldelight फ़ोल्डर को परिभाषित किया है और फीचर जेनरेटेड कोटलिन कक्षाओं के लिए फ़ोल्डर भी बनाया है क्योंकि यह gradle.build.kts में कॉन्फ़िगर किया गया है और sqldelight फ़ोल्डर के अंदर एक *.sq फ़ाइल भी है

sqldelight {
  database("CoreDb") {
    packageName = "com.example.app.core.database"
    sourceFolders = listOf("sqldelight")
    dialect = "sqlite:3.24"
  }
}

जब मैं generateSqlDelightInterface कार्य चलाता हूं तो मुझे बस वे लॉग दिखाई देते हैं

> Task :core:generateAndroidDebugCoreDbInterface NO-SOURCE
> Task :core:generateAndroidReleaseCoreDbInterface NO-SOURCE
> Task :core:generateIosMainCoreDbInterface NO-SOURCE
> Task :core:generateMetadataCommonMainCoreDbInterface NO-SOURCE
> Task :core:generateMetadataMainCoreDbInterface NO-SOURCE
> Task :core:generateSqlDelightInterface UP-TO-DATE
can't register checkAndroidModules

BUILD SUCCESSFUL in 311ms
1:40:36 PM: Task execution finished 'generateSqlDelightInterface'.

ये रहा मेरा पूरा build.gradle.kts

import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget

plugins {
  kotlin("multiplatform")
  kotlin("plugin.serialization")
  id("com.android.library")
  id("kotlin-android-extensions")
  id("koin")
  id("com.squareup.sqldelight")
}

repositories {
  gradlePluginPortal()
  google()
  jcenter()
  mavenCentral()
  maven {
    url = uri("https://dl.bintray.com/kotlin/kotlin-eap")
  }
  maven {
    url = uri("https://dl.bintray.com/ekito/koin")
  }
}
kotlin {
  android()

  val iOSTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget =
    if (System.getenv("SDK_NAME")?.startsWith("iphoneos") == true)
      ::iosArm64
    else
      ::iosX64

  iOSTarget("ios") {
    binaries {
      framework {
        baseName = "core"
      }
    }
  }
  val coroutinesVersion = "1.3.9-native-mt"
  val ktor_version = "1.4.2"
  val serializationVersion = "1.0.0-RC"
  val koin_version = "3.0.0-alpha-4"
  val sqlDelight = "1.4.4"

  sourceSets {

    val commonMain by getting {
      dependencies {
        implementation("io.ktor:ktor-client-core:$ktor_version")
        implementation("io.ktor:ktor-client-serialization:$ktor_version")

        implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion")
        implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:$serializationVersion")


        implementation("com.squareup.sqldelight:runtime:$sqlDelight")
        // SqlDelight extension
        implementation("com.squareup.sqldelight:coroutines-extensions:$sqlDelight")
        // Koin for Kotlin
        implementation("org.koin:koin-core:$koin_version")
        //shared preferences
        implementation("com.russhwolf:multiplatform-settings:0.6.3")
      }
    }
    val commonTest by getting {
      dependencies {
        implementation(kotlin("test-common"))
        implementation(kotlin("test-annotations-common"))
      }
    }
    val androidMain by getting {
      dependencies {
        implementation("androidx.core:core-ktx:1.3.2")
        implementation("io.ktor:ktor-client-android:$ktor_version")
        implementation("com.squareup.sqldelight:android-driver:$sqlDelight")
      }
    }
    val androidTest by getting {
      dependencies {
        implementation(kotlin("test-junit"))
        implementation("junit:junit:4.12")
      }
    }
    val iosMain by getting {
      dependencies {
        implementation("io.ktor:ktor-client-ios:$ktor_version")
        implementation("com.squareup.sqldelight:native-driver:$sqlDelight")
      }
    }

  
    val iosTest by getting
  }
}



android {
  compileSdkVersion(29)
  sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
  defaultConfig {
    minSdkVersion(23)
    targetSdkVersion(29)
    versionCode = 1
    versionName = "1.0"
  }
  buildTypes {
    getByName("release") {
      isMinifyEnabled = false
    }
  }
}
val packForXcode by tasks.creating(Sync::class) {
  group = "build"
  val mode = System.getenv("CONFIGURATION") ?: "DEBUG"
  val sdkName = System.getenv("SDK_NAME") ?: "iphonesimulator"
  val targetName = "ios" + if (sdkName.startsWith("iphoneos")) "Arm64" else "X64"
  val framework =
    kotlin.targets.getByName<KotlinNativeTarget>("ios").binaries.getFramework(mode)
  inputs.property("mode", mode)
  dependsOn(framework.linkTask)
  val targetDir = File(buildDir, "xcode-frameworks")
  from({ framework.outputDirectory })
  into(targetDir)
}
tasks.getByName("build").dependsOn(packForXcode)


sqldelight {
  database("CoreDb") {
    packageName = "com.example.app.core.database"
    sourceFolders = listOf("sqldelight")
    dialect = "sqlite:3.24"
  }
}

और शीर्ष स्तर के लिए build.gradle

classpath "com.squareup.sqldelight:gradle-plugin:$sqlDelight"

अपडेट करें

मेरी परियोजना फ़ोल्डर संरचना

root
  app
    src
      ...

  core //(kmm shared module)
    androidMain
        com.example.app.core
            database
    commonMain
        com.example.app.core
            database
            repository
            ...
            sqldelight
    iosMain
        com.example.app.core
            database
6
Jemo Mgebrishvili 27 नवम्बर 2020, 12:45

1 उत्तर

सबसे बढ़िया उत्तर

ऐसा लगता है कि आपके पास अपना sqldelight फ़ोल्डर है, जहां आपने अपनी *.sq फ़ाइलें गलत जगह पर रखी हैं।

इसे सीधे commonMain के अंदर रखा जाना चाहिए और sqldelight के अंदर आपको अपना पैकेज निर्दिष्ट करना होगा।

enter image description here

5
shadowsheep 27 नवम्बर 2020, 14:46