Внедрить базу данных комнат в Koin в режиме создания мультиплатформы.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Внедрить базу данных комнат в Koin в режиме создания мультиплатформы.

Сообщение Anonymous »

Я хочу внедрить файлы Room db в koin в Compose Multiplatform, но получаю ошибку времени выполнения из внедренного интерфейса Dao в подрядчике источника данных. как я могу внедрить его в appModule
Это мой источник данных:

Код: Выделить всё

class LocalDataSourceImpl(private val noteDao: NoteDao) : LocalDataSource {

private val mutex = Mutex()
override suspend fun getAllNotes(categoryId: Int?): List = mutex.withLock {
return if (categoryId == 1) noteDao.getAllNotes().toModel() else noteDao.getNotes(
categoryId
).first().toModel()
}

override suspend fun upsertNote(note: NoteEntity) = mutex.withLock {
noteDao.upsertNote(note)
}

override suspend fun deleteNote(noteId: String): Int = mutex.withLock {
noteDao.deleteById(noteId)
}

override suspend fun completeNote(noteId: String) = mutex.withLock {
noteDao.updateCompleted(noteId = noteId, completed = true)
}

override suspend fun activateNote(noteId: String) = mutex.withLock {
noteDao.updateCompleted(noteId = noteId, completed = false)
}

override suspend fun getNoteById(noteId: String): NoteEntity? = mutex.withLock {
return noteDao.getNoteById(noteId = noteId).first()
}

override suspend fun clearCompletedNotes(): Int = mutex.withLock {
noteDao.deleteCompleted()
}

}

Модуль монет

Код: Выделить всё

fun appModule() = module {
factory { SavedStateHandle() }
single {
LocalDataSourceImpl(get())
}

single {
NotesRepositoryImpl(get(), get())
}
}
и модуль commonMain:

Код: Выделить всё

@Composable
internal fun App() {
KoinApplication(application = {
modules(appModule())
}) {
AppTheme {
App()
}
}
}
Я создал ожидаемый класс и создал фактические классы:

Код: Выделить всё

expect class Factory {
fun createRoomDatabase(): AppDatabase
}

actual class Factory(private val app: Application) {
actual fun createRoomDatabase(): AppDatabase {
val dbFile = app.getDatabasePath(dbFileName)
return Room.databaseBuilder(app, dbFile.absolutePath)
.setDriver(BundledSQLiteDriver())
.setQueryCoroutineContext(Dispatchers.IO)
.build()
}
}

actual class Factory {
actual fun createRoomDatabase(): AppDatabase {
val dbFile = "${fileDirectory()}/$dbFileName"
return Room.databaseBuilder(
name = dbFile,
factory =  { AppDatabase::class.instantiateImpl() }
).setDriver(BundledSQLiteDriver())
.setQueryCoroutineContext(Dispatchers.IO)
.build()
}

@OptIn(ExperimentalForeignApi::class)
private fun fileDirectory(): String {
val documentDirectory: NSURL? = NSFileManager.defaultManager.URLForDirectory(
directory = NSDocumentDirectory,
inDomain = NSUserDomainMask,
appropriateForURL = null,
create = false,
error = null,
)
return requireNotNull(documentDirectory).path!!
}

}
где мне следует вызвать функцию createRoomDatabase()?
и почему я получаю эту ошибку:
Причина: org.koin.core.error.NoBeanDefFoundException: Нет найдено определение для типа «database.NoteDao». Проверьте конфигурацию своих модулей и добавьте отсутствующий тип и/или квалификатор!
как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/784 ... tiplatform
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»