Inject db drivers by platform

pull/2064/head
lihenggui 1 year ago
parent 7512f3d347
commit adeb133429

@ -60,7 +60,7 @@ internal val appModules = module {
includes(
*commonModule().toTypedArray(),
AnalyticsModule().module,
*databaseModule().toTypedArray(),
databaseModule,
dataModule,
dataStoreModule(),
*networkModule().toTypedArray(),

@ -35,6 +35,7 @@ kotlin {
implementation(libs.sqldelight.primitive.adapters)
}
androidMain.dependencies {
implementation(libs.koin.android)
implementation(libs.sqldelight.android.driver)
}
androidUnitTest.dependencies {

@ -19,21 +19,20 @@ package com.google.samples.apps.nowinandroid.core.database.di
import android.content.Context
import androidx.sqlite.db.SupportSQLiteDatabase
import app.cash.sqldelight.async.coroutines.synchronous
import app.cash.sqldelight.db.QueryResult.AsyncValue
import app.cash.sqldelight.db.QueryResult
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 org.koin.core.annotation.Single
import org.koin.android.ext.koin.androidContext
import org.koin.dsl.module
@Single
internal actual class DriverProvider(val context: Context) {
actual suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver {
internal actual val driverModule = module {
single<SqlDriver> {
val schema: SqlSchema<QueryResult.AsyncValue<Unit>> = get()
val context: Context = androidContext()
val synchronousSchema = schema.synchronous()
return AndroidSqliteDriver(
AndroidSqliteDriver(
schema = synchronousSchema,
context = context,
name = "nia-database.db",

@ -16,42 +16,54 @@
package com.google.samples.apps.nowinandroid.core.database.di
import app.cash.sqldelight.db.QueryResult
import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.db.SqlSchema
import com.google.samples.apps.nowinandroid.core.database.NiaDatabase
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDaoInterface
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDao
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDaoInterface
import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryDao
import com.google.samples.apps.nowinandroid.core.database.dao.RecentSearchQueryDaoInterface
import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao
import com.google.samples.apps.nowinandroid.core.database.dao.TopicDaoInterface
import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao
import kotlinx.coroutines.runBlocking
import org.koin.core.annotation.ComponentScan
import org.koin.core.annotation.Module
import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDaoInterface
import com.google.samples.apps.nowinandroid.core.di.coroutineDispatcherModule
import org.koin.core.module.Module
import org.koin.dsl.module
import org.koin.ksp.generated.module
internal val driverModule = module {
single { NiaDatabase.Schema }
single<SqlDriver> {
val driverProvider: DriverProvider = get()
// TODO check if we can remove runBlocking
runBlocking {
driverProvider.provideDbDriver(get())
}
internal expect val driverModule: Module
internal val schemaModule = module {
single<SqlSchema<QueryResult.AsyncValue<Unit>>> { NiaDatabase.Schema }
}
internal val dbModule = module {
single { (driver: SqlDriver) ->
NiaDatabase(driver)
}
}
internal val daoModule = module {
single { (driver: SqlDriver) -> NiaDatabase(driver) }
factory { (database: NiaDatabase) -> TopicDao(database, get()) }
factory<TopicDaoInterface> { (database: NiaDatabase) ->
TopicDao(database, get())
}
factory { (database: NiaDatabase) -> NewsResourceDao(database, get()) }
factory <NewsResourceDaoInterface> { (database: NiaDatabase) ->
NewsResourceDao(database, get())
}
factory { (database: NiaDatabase) -> TopicFtsDao(database, get()) }
factory<TopicFtsDaoInterface> { (database: NiaDatabase) ->
TopicFtsDao(database, get())
}
factory { (database: NiaDatabase) -> NewsResourceFtsDao(database, get()) }
factory<NewsResourceFtsDaoInterface> { (database: NiaDatabase) ->
NewsResourceFtsDao(database, get())
}
factory { (database: NiaDatabase) ->
factory<RecentSearchQueryDaoInterface> { (database: NiaDatabase) ->
RecentSearchQueryDao(
database,
get(),
@ -59,12 +71,12 @@ internal val daoModule = module {
}
}
fun databaseModule() = listOf(
driverModule,
DatabaseModule().module,
daoModule,
)
@Module
@ComponentScan
class DatabaseModule
val databaseModule: Module get() = module {
includes(coroutineDispatcherModule)
includes(
schemaModule,
driverModule,
dbModule,
daoModule,
)
}

@ -1,27 +0,0 @@
/*
* Copyright 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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
internal expect class DriverProvider {
suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver
}

@ -19,20 +19,23 @@ 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 app.cash.sqldelight.driver.jdbc.sqlite.JdbcSqliteDriver
import org.koin.core.annotation.Single
import java.util.Properties
import kotlinx.coroutines.runBlocking
@Single
internal actual class DriverProvider {
import org.koin.dsl.module
import java.util.Properties
actual suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver {
return JdbcSqliteDriver(
internal actual val driverModule = module {
single<SqlDriver> { (schema: SqlSchema<AsyncValue<Unit>>) ->
JdbcSqliteDriver(
url = JdbcSqliteDriver.IN_MEMORY,
properties = Properties().apply { put("foreign_keys", "true") },
)
.also { schema.create(it).await() }
.also {
runBlocking {
schema.create(it).await()
}
}
}
}

@ -23,17 +23,12 @@ 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 org.koin.core.annotation.Single
import org.koin.dsl.module
@Single
internal actual class DriverProvider {
actual suspend fun provideDbDriver(
schema: SqlSchema<AsyncValue<Unit>>,
): SqlDriver {
val synchronousSchema = schema.synchronous()
return NativeSqliteDriver(
schema = synchronousSchema,
internal actual val driverModule = module {
single<SqlDriver> { (schema: SqlSchema<AsyncValue<Unit>>) ->
NativeSqliteDriver(
schema = schema.synchronous(),
name = "nia-database.db",
onConfiguration = { config: DatabaseConfiguration ->
config.copy(
@ -42,4 +37,4 @@ internal actual class DriverProvider {
},
)
}
}
}
Loading…
Cancel
Save