Hello, I have an issue with Room and KSP (KMP cont...
# room
m
Hello, I have an issue with Room and KSP (KMP context) and I don't seem to find a workaround. I am using Room 2.7.0-rc02, KSP 2.1.10-1.0.31 and Kotlin 2.1.10. I have a multi-module project with a module for the database and another one for the DAO. I always encounter the following issue:
Copy code
[ksp] [MissingType]: Element 'com.msoula.hobbymatchmaker.core.database.dao.converters.Converters' references a type that is not present
My build.gradle (dao module - database is pretty similar)
Copy code
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

plugins {
    `kotlin-multiplatform`
    `android-library`
    alias(libs.plugins.compose.compiler)
    alias(libs.plugins.compose.multiplatform)
    alias(libs.plugins.serialization)
    alias(libs.plugins.room.multiplatform)
    alias(libs.plugins.ksp)
}

kotlin {
    applyDefaultHierarchyTemplate()

    androidTarget {
        compilerOptions {
            jvmTarget.set(JvmTarget.JVM_21)
        }
    }

    iosX64()
    iosArm64()
    iosSimulatorArm64()

    sourceSets {
        commonMain.dependencies {
            implementation(compose.runtime)
            implementation(libs.kotlinx.coroutines.kmp)
            implementation(libs.kotlinx.serialization)

            //
            implementation(libs.room.common)
            implementation(libs.room.runtime)
        }

        androidMain.dependencies {
            // Room
            implementation(libs.room.runtime.android)
        }
    }
}

room { schemaDirectory("$projectDir/schemas") }

android {
    namespace = "com.msoula.hobbymatchmaker.core.database.dao"
    compileSdk = AndroidConfig.COMPILE_SDK

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_21
        targetCompatibility = JavaVersion.VERSION_21
    }

    defaultConfig {
        minSdk = AndroidConfig.MIN_SDK
    }
}

dependencies {
    add("kspCommonMainMetadata", libs.room.compiler)
    add("kspAndroid", libs.room.compiler)
    add("kspIosX64", libs.room.compiler)
    add("kspIosArm64", libs.room.compiler)
    add("kspIosSimulatorArm64", libs.room.compiler)
}
And the converter class
Copy code
class Converters {

    val jsonParser = Json { encodeDefaults = true; ignoreUnknownKeys = true }

    @TypeConverter
    fun fromGenreStringList(genres: List<String>?): String? {
        return genres?.joinToString(",")
    }

    @TypeConverter
    fun toGenreStringList(data: String?): List<String>? {
        return data?.split(",")?.map { it.trim() }
    }

    @TypeConverter
    fun fromGenreList(genres: List<Genre>?): String? {
        return genres?.let { jsonParser.encodeToString(it) }
    }

    @TypeConverter
    fun toGenreList(genreString: String?): List<Genre> {
        return genreString?.let { jsonParser.decodeFromString<List<Genre>>(it) } ?: emptyList()
    }

    @TypeConverter
    fun fromActorList(actors: List<Actor>?): String? {
        return actors?.let { jsonParser.encodeToString(it) }
    }

    @TypeConverter
    fun toActorList(actorString: String?): List<Actor> {
        return actorString?.let { jsonParser.decodeFromString<List<Actor>>(it) } ?: emptyList()
    }
}
i
can you show your database class?
m
I ended up switching to SQLDelight. I'm having way fewer issues 😊.