【发布时间】:2021-11-05 23:49:57
【问题描述】:
我正在尝试在适用于 Android 和 iOS 的 Kotlin 多平台项目中使用 SQLDelight。我遵循了找到here 的文档。该项目成功构建,但我无法访问 com.squareup.* shared/iosMain 文件夹内的任何位置。以下是我的代码文件。
项目/build.gradle.kts:
buildscript {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31")
classpath("com.android.tools.build:gradle:7.0.3")
classpath("com.squareup.sqldelight:gradle-plugin:1.5.2")
}
}
allprojects {
repositories {
google()
mavenCentral()
}
}
tasks.register("clean", Delete::class) {
delete(rootProject.buildDir)
}
项目/shared/build.gradle.kts:
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
plugins {
kotlin("multiplatform")
kotlin("native.cocoapods")
id("com.android.library")
id("com.squareup.sqldelight")
}
version = "1.0"
kotlin {
android()
val iosTarget: (String, KotlinNativeTarget.() -> Unit) -> KotlinNativeTarget = when {
System.getenv("SDK_NAME")?.startsWith("iphoneos") == true -> ::iosArm64
System.getenv("NATIVE_ARCH")?.startsWith("arm") == true -> ::iosSimulatorArm64
else -> ::iosX64
}
iosTarget("ios") {}
cocoapods {
summary = "Some description for the Shared Module"
homepage = "Link to the Shared Module homepage"
ios.deploymentTarget = "14.1"
frameworkName = "shared"
podfile = project.file("../iosApp/Podfile")
}
sourceSets {
val commonMain by getting {
dependencies {
// SQLDelight
implementation("com.squareup.sqldelight:runtime:1.5.2")
implementation ("com.squareup.sqldelight:coroutines-extensions:1.5.0")
}
}
val commonTest by getting {
dependencies {
implementation(kotlin("test-common"))
implementation(kotlin("test-annotations-common"))
}
}
val androidMain by getting {
dependencies {
implementation("com.squareup.sqldelight:android-driver:1.5.0")
}
}
val androidTest by getting {
dependencies {
implementation(kotlin("test-junit"))
implementation("junit:junit:4.13.2")
}
}
val iosMain by getting {
dependencies {
implementation("com.squareup.sqldelight:native-driver:1.5.2")
}
}
val iosTest by getting
}
}
sqldelight {
database("AppDatabase") {
packageName = "com.example.sam.data.db"
dialect = "sqlite:3.25"
}
}
android {
compileSdkVersion(31)
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
minSdkVersion(21)
targetSdkVersion(31)
}
}
Project/shared/src/commonMain/kotlin/com/example/sam/data/db/DatabaseDriverFactory.kt
package com.example.sam.data.db
import com.squareup.sqldelight.db.SqlDriver
expect class DatabaseDriverFactory {
fun createDriver(): SqlDriver
}
Project/shared/src/androidMain/kotlin/com/example/sam/data/db/DatabaseDriverFactory.kt
package com.example.sam.data.db
import android.content.Context
import com.squareup.sqldelight.android.AndroidSqliteDriver
import com.squareup.sqldelight.db.SqlDriver
actual class DatabaseDriverFactory(
private val ctx: Context
) {
actual fun createDriver(): SqlDriver {
return AndroidSqliteDriver(AppDatabase.Schema, ctx, "app.db")
}
}
我遇到问题的文件 - Project/shared/iosMain/kotlin/com/example/sam/data/db/DatabaseDriverFactory.kt
package com.example.sam.data.db
import com.squareup.sqldelight.db.SqlDriver
import com.squareup.sqldelight.drivers.native.NativeSqliteDriver
actual class DatabaseDriverFactory {
actual fun createDriver(): SqlDriver {
return NativeSqliteDriver(AppDatabase.Schema, "app.db")
}
}
找不到 SqlDriver、NativeSqliteDriver 甚至 com.squareup.*。
我搜索了网络,但没有找到任何有用的东西。
【问题讨论】:
-
第一个问题是它是否只是一个 IDE 问题,或者构建是否也不起作用。接下来,您使用的是哪个版本的 Kotlin?你在用
enableDependencyPropagation吗?假设 gradle 构建工作但 IDE 无法识别依赖项,您通常只需要使用 Kotlin、库和 IDE 的最新稳定版本。 -
嗨@KevinGalligan,我不知道这是否是IDE问题,但我使用的是最新版本的android studio;该项目也成功构建,但未运行。我没有使用 enableDependencyPropagation,而是使用了最新的稳定版 kotlin。谢谢。
-
我不知道你所说的它构建但不运行是什么意思。我们应该将 Android Studio 问题与 Kotlin 问题分开,因为工作室配置仍然很脆弱(Kotlin 团队和 Android 团队并不总是完美同步)。我会在 Xcode 中打开项目并尝试从那里实际运行它,而不是 Android Studio。
-
如果你在项目的根目录下运行
./gradlew :shared:clean :shared:build会发生什么?它编译吗?如果是,那就是 IDE 问题,如果不是,那就是另外一回事了。从我的角度来看,您发布的代码看起来是正确的。
标签: android ios kotlin kotlin-multiplatform sqldelight