Use koin in the database module

pull/2064/head
lihenggui 1 year ago
parent 015528c5f7
commit 8224dbabc1

@ -16,7 +16,7 @@
plugins {
alias(libs.plugins.nowinandroid.kmp.library)
alias(libs.plugins.nowinandroid.kotlin.inject)
alias(libs.plugins.nowinandroid.di.koin)
alias(libs.plugins.sqldelight.gradle.plugin)
}

@ -24,13 +24,11 @@ import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.android.AndroidSqliteDriver
import app.cash.sqldelight.driver.android.AndroidSqliteDriver.Callback
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
import org.koin.core.annotation.Single
@Component
internal actual abstract class DriverModule(private val context: Context) {
@Single
internal actual class DriverProvider(val context: Context) {
@Provides
actual suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver {

@ -26,13 +26,12 @@ import com.google.samples.apps.nowinandroid.core.model.data.NewsResource
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.datetime.Instant
import me.tatarka.inject.annotations.Inject
/**
* DAO for [NewsResource] and [NewsResourceEntity] access
*/
@Inject
class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) : NewsResourceDaoInterface {
class NewsResourceDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) :
NewsResourceDaoInterface {
private val query = db.newsResourceQueries
/**

@ -24,12 +24,10 @@ import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceFtsE
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import me.tatarka.inject.annotations.Inject
/**
* DAO for [NewsResourceFtsEntity] access.
*/
@Inject
class NewsResourceFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) : NewsResourceFtsDaoInterface {
private val dbQuery = db.newsResourceFtsQueries
override suspend fun insertAll(newsResources: List<NewsResourceFtsEntity>) {

@ -24,12 +24,10 @@ import com.google.samples.apps.nowinandroid.core.database.model.RecentSearchQuer
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.datetime.Instant
import me.tatarka.inject.annotations.Inject
/**
* DAO for [RecentSearchQueryEntity] access
*/
@Inject
class RecentSearchQueryDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) : RecentSearchQueryDaoInterface {
private val query = db.recentSearchQueryQueries

@ -24,12 +24,10 @@ import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import me.tatarka.inject.annotations.Inject
/**
* DAO for [TopicEntity] access
*/
@Inject
class TopicDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) : TopicDaoInterface {
private val query = db.topicsQueries

@ -24,12 +24,10 @@ import com.google.samples.apps.nowinandroid.core.database.model.TopicFtsEntity
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import me.tatarka.inject.annotations.Inject
/**
* DAO for [TopicFtsEntity] access.
*/
@Inject
class TopicFtsDao(db: NiaDatabase, private val dispatcher: CoroutineDispatcher) : TopicFtsDaoInterface {
private val dbQuery = db.topicFtsQueries

@ -23,43 +23,48 @@ import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDao
import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryDao
import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao
import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao
import com.google.samples.apps.nowinandroid.core.di.Dispatcher
import com.google.samples.apps.nowinandroid.core.di.DispatchersComponent
import com.google.samples.apps.nowinandroid.core.di.NiaDispatchers.IO
import kotlinx.coroutines.CoroutineDispatcher
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
import kotlinx.coroutines.runBlocking
import org.koin.core.annotation.ComponentScan
import org.koin.core.annotation.Module
import org.koin.core.qualifier.named
import org.koin.dsl.module
import org.koin.ksp.generated.module
@Component
abstract class DatabaseModule(@Component val dispatchersComponent: DispatchersComponent) {
@Dispatcher(IO)
abstract val dispatcher: CoroutineDispatcher
internal val driverModule = module {
single { NiaDatabase.Schema }
single<SqlDriver> {
val driverProvider: DriverProvider = get()
// TODO check if we can remove runBlocking
runBlocking {
driverProvider.provideDbDriver(get())
}
}
}
@Provides
fun providesNiaDatabase(driver: SqlDriver): NiaDatabase = NiaDatabase(driver)
internal val daoModule = module {
single { (driver: SqlDriver) -> NiaDatabase(driver) }
@Provides
fun providesTopicsDao(
database: NiaDatabase,
): TopicDao = TopicDao(database, dispatcher)
factory { (database: NiaDatabase) -> TopicDao(database, get(named("IoDispatcher"))) }
@Provides
fun providesNewsResourceDao(
database: NiaDatabase,
): NewsResourceDao = NewsResourceDao(database, dispatcher)
factory { (database: NiaDatabase) -> NewsResourceDao(database, get(named("IoDispatcher"))) }
@Provides
fun providesTopicFtsDao(
database: NiaDatabase,
): TopicFtsDao = TopicFtsDao(database, dispatcher)
factory { (database: NiaDatabase) -> TopicFtsDao(database, get(named("IoDispatcher"))) }
@Provides
fun providesNewsResourceFtsDao(
database: NiaDatabase,
): NewsResourceFtsDao = NewsResourceFtsDao(database, dispatcher)
factory { (database: NiaDatabase) -> NewsResourceFtsDao(database, get(named("IoDispatcher"))) }
@Provides
fun providesRecentSearchQueryDao(
database: NiaDatabase,
): RecentSearchQueryDao = RecentSearchQueryDao(database, dispatcher)
factory { (database: NiaDatabase) ->
RecentSearchQueryDao(
database,
get(named("IoDispatcher")),
)
}
}
val databaseModule = listOf(
DatabaseModule().module,
daoModule,
)
@Module
@ComponentScan
class DatabaseModule

@ -19,10 +19,8 @@ package com.google.samples.apps.nowinandroid.core.database.di
import app.cash.sqldelight.db.QueryResult.AsyncValue
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import me.tatarka.inject.annotations.Provides
internal expect abstract class DriverModule {
@Provides
internal expect class DriverProvider {
suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver

@ -20,13 +20,12 @@ import app.cash.sqldelight.db.QueryResult.AsyncValue
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
import org.koin.core.annotation.Single
import java.util.Properties
@Component
internal actual abstract class DriverModule {
@Provides
@Single
internal actual class DriverProvider {
actual suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver {

@ -23,13 +23,11 @@ import app.cash.sqldelight.db.SqlSchema
import app.cash.sqldelight.driver.native.NativeSqliteDriver
import co.touchlab.sqliter.DatabaseConfiguration
import co.touchlab.sqliter.DatabaseConfiguration.Extended
import me.tatarka.inject.annotations.Component
import me.tatarka.inject.annotations.Provides
import org.koin.core.annotation.Single
@Component
internal actual abstract class DriverModule {
@Single
internal actual class DriverProvider {
@Provides
actual suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver {
Loading…
Cancel
Save