Room 2.7.0-alpha06 부터 cmp(kmp)에서 사용 법이 변경되었다.
기존에는 instantiateImpl()를 참조하여 사용하였으나,
실제로 사용해보면 iosMain에 대해서는 만들어지지 않아서
iosX64(),iosArm64(),iosSimulatorArm64()에 대해 각각 instantiateImpl를 연결해줘야 하는 불편함이 있었다.
@ConstructedBy 및 RoomDatabaseConstructor를 이용하여 작성 할 수 있도록 변경되었다.
CommonMain에 다음과 같은 RoomDatabaseConstructor를 정의하자
expect object MyDatabaseCtor : RoomDatabaseConstructor<AppDatabase>
이는 컴파일시 자동으로 actual object가 생성됩니다.
@ConstructedBy()를 이용하여 (1)에서 정의한 object를 연결해줍니다.
@Database(
entities = [],
version = 1,
exportSchema = true
)
@ConstructedBy(MyDatabaseCtor::class) // NEW
abstract class AppDatabase : RoomDatabase() {
///DAO...
}
기존에는 Factory를 사용하여 연결해야 했으나, 플랫폼별로 저장위치만 지정해 주면된다.
@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())
}
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 버전부터 해결된것으로 보인다,.