Compose(Kotlin) Multiplatform Room 사용하기(2)

WonDDak·2024년 9월 9일
0

KMP- Kotlin MultiPlatform

목록 보기
10/12

Compose(Kotlin) Multiplatform Room 사용하기(2)

Room 2.7.0-alpha06 부터 cmp(kmp)에서 사용 법이 변경되었다.

기존 방식

기존에는 instantiateImpl()를 참조하여 사용하였으나,

실제로 사용해보면 iosMain에 대해서는 만들어지지 않아서

iosX64(),iosArm64(),iosSimulatorArm64()에 대해 각각 instantiateImpl를 연결해줘야 하는 불편함이 있었다.

신규 방식

@ConstructedByRoomDatabaseConstructor를 이용하여 작성 할 수 있도록 변경되었다.

RoomDatabaseConstructor를 구현하는 예상 객체 정의

CommonMain에 다음과 같은 RoomDatabaseConstructor를 정의하자

expect object MyDatabaseCtor : RoomDatabaseConstructor<AppDatabase>

이는 컴파일시 자동으로 actual object가 생성됩니다.

@ConstructedBy를 사용하여 객체를 @Database 선언과 연결

@ConstructedBy()를 이용하여 (1)에서 정의한 object를 연결해줍니다.

@Database(
    entities = [],
    version = 1,
    exportSchema = true
)
@ConstructedBy(MyDatabaseCtor::class) // NEW
abstract class AppDatabase : RoomDatabase() {
    ///DAO...
}

Factory 없이 연결

기존에는 Factory를 사용하여 연결해야 했으나, 플랫폼별로 저장위치만 지정해 주면된다.

ios

@OptIn(ExperimentalForeignApi::class)
internal fun providePath() :String {
    val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
        directory = NSLibraryDirectory,
        inDomain = NSUserDomainMask,
        appropriateForURL = null,
        create = false,
        error = null,
    )
    return (requireNotNull(documentDirectory).path + "/$DB_NAME")
}

actual fun getDatabaseBuilder(): RoomDatabase.Builder<AppDatabase> {
    return Room.databaseBuilder<AppDatabase>(name = providePath())
}

android

actual fun getDatabaseBuilder(): RoomDatabase.Builder<AppDatabase> {
    val appContext : Context = KoinJavaComponent.getKoin().get()
    val dbFile = appContext.getDatabasePath(DB_NAME)
    return Room.databaseBuilder<AppDatabase>(
        context = appContext,
        name = dbFile.absolutePath
    )
}

마치며

확실히 좀더 편해진것 같다.
그리고 (1)에서

error: Unresolved reference 'recursiveFetchLongSparseArray'.
관련 에러도 06 버전부터 해결된것으로 보인다,.

profile
안녕하세요. 원딱입니다.

0개의 댓글