From 40549ad8b5fddf63a48dff264dccb5243a6eda98 Mon Sep 17 00:00:00 2001 From: Andrei Beriukhov Date: Tue, 16 Jul 2024 17:49:30 +0300 Subject: [PATCH] Replace Realm to Room and up Kotlin to 2.0.20-beta02 (#245) * Add Room to replace Realm * Remove Realm and update Kotlin --- Makefile | 4 +- README.md | 4 +- .../ru/beryukhov/coffeegram/Application.kt | 13 +++- .../coffeegram/model/DaysCoffeesStore.kt | 4 +- .../coffeegram/repository/CoffeeStorage.kt | 4 +- build.gradle.kts | 3 +- cmp-common/build.gradle.kts | 23 ------- .../ru/beryukhov/repository/DriverFactory.kt | 2 +- .../model/{DayCoffee.kt => DbDayCoffee.kt} | 11 --- gradle.properties | 2 - gradle/libs.versions.toml | 16 +++-- repository/build.gradle.kts | 31 +++++---- .../repository.room.AppDatabase/1.json | 49 +++++++++++++ .../repository/room/AppDatabase.android.kt | 28 ++++++++ .../kotlin/AndroidGreetingTest.kt | 12 ---- .../kotlin/repository/CoffeeRepository.kt | 69 +++++++++---------- .../kotlin/repository/model/DayCoffee.kt | 22 ------ .../kotlin/repository/model/DbDayCoffee.kt | 3 + .../kotlin/repository/room/AppDatabase.kt | 12 ++++ .../kotlin/repository/room/DayCoffeeDao.kt | 28 ++++++++ .../kotlin/repository/CommonGreetingTest.kt | 12 ---- .../kotlin/repository/room/AppDatabase.ios.kt | 27 ++++++++ .../kotlin/repository/IosGreetingTest.kt | 10 --- 23 files changed, 232 insertions(+), 157 deletions(-) rename cmp-repository/src/commonMain/kotlin/repository/model/{DayCoffee.kt => DbDayCoffee.kt} (51%) create mode 100644 repository/schemas/repository.room.AppDatabase/1.json create mode 100644 repository/src/androidMain/kotlin/repository/room/AppDatabase.android.kt delete mode 100644 repository/src/androidUnitTest/kotlin/AndroidGreetingTest.kt delete mode 100644 repository/src/commonMain/kotlin/repository/model/DayCoffee.kt create mode 100644 repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt create mode 100644 repository/src/commonMain/kotlin/repository/room/AppDatabase.kt create mode 100644 repository/src/commonMain/kotlin/repository/room/DayCoffeeDao.kt delete mode 100644 repository/src/commonTest/kotlin/repository/CommonGreetingTest.kt create mode 100644 repository/src/iosMain/kotlin/repository/room/AppDatabase.ios.kt delete mode 100644 repository/src/iosTest/kotlin/repository/IosGreetingTest.kt diff --git a/Makefile b/Makefile index 1a2d0ee8..8d6cac3e 100644 --- a/Makefile +++ b/Makefile @@ -2,6 +2,8 @@ SHELL := /bin/bash path := ./ +params := --console=plain + detekt: $(path)gradlew detektAll @@ -21,7 +23,7 @@ buildAndroid: testCommon: ./gradlew :cmp-common:testDebugUnitTest -localCheck: detekt buildApp buildWear buildAndroid testCommon +localCheck: detekt buildApp buildWear buildAndroid testCommon $(params) compose_metrics: $(path)gradlew :app:assembleRelease \-Pmyapp.enableComposeCompilerReports=true diff --git a/README.md b/README.md index a554c3ad..d213e910 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Compose Version](https://img.shields.io/badge/Jetpack%20Compose-1.6.8-yellow)](https://developer.android.com/jetpack/compose) [![Compose Version](https://img.shields.io/badge/Compose%20Multiplatform-1.6.11-yellow)](https://github.com/JetBrains/compose-multiplatform) [![WearCompose Version](https://img.shields.io/badge/Wear%20Compose-1.3.1-yellow)](https://developer.android.com/jetpack/androidx/releases/wear-compose) -[![Kotlin Version](https://img.shields.io/badge/Kotlin-2.0.0-blue.svg)](https://kotlinlang.org) +[![Kotlin Version](https://img.shields.io/badge/Kotlin-2.0.20--Beta2-blue.svg)](https://kotlinlang.org) ![Android CI](https://github.com/phansier/Coffeegram/workflows/Android%20CI/badge.svg?branch=master) [![Jetc.dev](https://img.shields.io/badge/jetc.dev-25-blue)](https://jetc.dev/issues/025.html) [![Hits-of-Code](https://hitsofcode.com/github/phansier/Coffeegram?branch=develop)](https://hitsofcode.com/github/phansier/Coffeegram/view?branch=develop) @@ -28,7 +28,7 @@ - Jetpack Datastore -- Realm Multiplatform as an database +- Room Multiplatform as an database drawing drawing diff --git a/app/src/main/java/ru/beryukhov/coffeegram/Application.kt b/app/src/main/java/ru/beryukhov/coffeegram/Application.kt index a96ee9ea..2253731a 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/Application.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/Application.kt @@ -8,6 +8,9 @@ import org.koin.android.ext.koin.androidContext import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.context.startKoin import org.koin.dsl.module +import repository.CoffeeRepository +import repository.RoomCoffeeRepository +import repository.room.roomModule import ru.beryukhov.coffeegram.model.DaysCoffeesStore import ru.beryukhov.coffeegram.model.HeavyDaysCoffeesStore import ru.beryukhov.coffeegram.model.NavigationStore @@ -16,6 +19,7 @@ import ru.beryukhov.coffeegram.model.ThemeStore import ru.beryukhov.coffeegram.pages.CoffeeListViewModelImpl import ru.beryukhov.coffeegram.pages.MapPageViewModelImpl import ru.beryukhov.coffeegram.pages.TablePageViewModelImpl +import ru.beryukhov.coffeegram.repository.CoffeeStorage import ru.beryukhov.coffeegram.repository.ThemeDataStoreProtoStorage import ru.beryukhov.coffeegram.store_lib.Storage import ru.beryukhov.coffeegram.widget.FirstGlanceWidget @@ -30,7 +34,9 @@ class Application : Application() { single { ThemeStore(get()) } - single { HeavyDaysCoffeesStore() } + single { RoomCoffeeRepository(get()) } + single { CoffeeStorage(get()) } + single { HeavyDaysCoffeesStore(get()) } // single { LightDaysCoffeesStore() } single { NavigationStore() } viewModel { CoffeeListViewModelImpl(daysCoffeesStore = get(), navigationStore = get()) } @@ -42,7 +48,10 @@ class Application : Application() { super.onCreate() startKoin { androidContext(this@Application) - modules(appModule) + modules( + appModule, + roomModule() + ) } // causes java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken // or in a snapshot that has not yet been applied diff --git a/app/src/main/java/ru/beryukhov/coffeegram/model/DaysCoffeesStore.kt b/app/src/main/java/ru/beryukhov/coffeegram/model/DaysCoffeesStore.kt index b01f02e9..2bfbdc64 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/model/DaysCoffeesStore.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/model/DaysCoffeesStore.kt @@ -11,9 +11,9 @@ import ru.beryukhov.coffeegram.store_lib.Store interface DaysCoffeesStore : Store -class HeavyDaysCoffeesStore : PersistentStore( +class HeavyDaysCoffeesStore(storage: CoffeeStorage) : PersistentStore( initialState = DaysCoffeesState(), - storage = CoffeeStorage() + storage = storage ), DaysCoffeesStore { override fun handleIntent(intent: DaysCoffeesIntent): DaysCoffeesState { diff --git a/app/src/main/java/ru/beryukhov/coffeegram/repository/CoffeeStorage.kt b/app/src/main/java/ru/beryukhov/coffeegram/repository/CoffeeStorage.kt index 0bbad2a7..9e406f31 100644 --- a/app/src/main/java/ru/beryukhov/coffeegram/repository/CoffeeStorage.kt +++ b/app/src/main/java/ru/beryukhov/coffeegram/repository/CoffeeStorage.kt @@ -9,9 +9,7 @@ import ru.beryukhov.coffeegram.data.DayCoffee import ru.beryukhov.coffeegram.model.DaysCoffeesState import ru.beryukhov.coffeegram.store_lib.Storage -val lazy_repository: CoffeeRepository by lazy { CoffeeRepository() } - -class CoffeeStorage(private val repository: CoffeeRepository = lazy_repository) : +class CoffeeStorage(private val repository: CoffeeRepository) : Storage { override suspend fun getState(): DaysCoffeesState { return repository.getAll().toState() diff --git a/build.gradle.kts b/build.gradle.kts index 58564e90..b84d0b22 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,8 @@ buildscript { dependencies { classpath(libs.androidGradle) classpath(libs.kotlinGradle) - classpath(libs.realmGradle) + classpath(libs.roomGradle) + classpath(libs.ksp) classpath(libs.composeGradle) classpath(libs.sqldelightGradle) diff --git a/cmp-common/build.gradle.kts b/cmp-common/build.gradle.kts index 1834dc98..ba7f22a3 100644 --- a/cmp-common/build.gradle.kts +++ b/cmp-common/build.gradle.kts @@ -2,12 +2,10 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat plugins { kotlin("multiplatform") -// kotlin("native.cocoapods") id("com.android.library") id("org.jetbrains.compose") id("org.jetbrains.kotlin.plugin.compose") - id("co.touchlab.kmmbridge") version "0.5.5" `maven-publish` } @@ -21,20 +19,6 @@ kotlin { iosArm64() iosSimulatorArm64() -// cocoapods { -// version = "1.0.0" -// summary = "Some description for the Shared Module" -// homepage = "https://github.com/phansier/Coffeegram" -// ios.deploymentTarget = "14.1" -// podfile = project.file("../cmp-iosApp/Podfile") -// framework { -// baseName = "cmp_common" -// isStatic = true -// } -// extraSpecAttributes["resources"] = "['src/commonMain/resources/**', 'src/iosMain/resources/**']" -// extraSpecAttributes["resources"] = "['src/commonMain/resources/**']" -// } - sourceSets { commonMain.dependencies { api(compose.runtime) @@ -121,10 +105,3 @@ compose.desktop { } } } - -kmmbridge { - mavenPublishArtifacts() - spm() - // cocoapods("git@github.com:phansier/PodSpecs.git") - addGithubPackagesRepository() -} diff --git a/cmp-repository/src/androidMain/kotlin/ru/beryukhov/repository/DriverFactory.kt b/cmp-repository/src/androidMain/kotlin/ru/beryukhov/repository/DriverFactory.kt index a9eb469c..96e2e700 100644 --- a/cmp-repository/src/androidMain/kotlin/ru/beryukhov/repository/DriverFactory.kt +++ b/cmp-repository/src/androidMain/kotlin/ru/beryukhov/repository/DriverFactory.kt @@ -4,7 +4,7 @@ import android.content.Context import app.cash.sqldelight.db.SqlDriver import app.cash.sqldelight.driver.android.AndroidSqliteDriver -lateinit var context: Context // todo fill it +lateinit var context: Context // todo fill it with koin instead internal actual class DriverFactory { actual fun createDriver(): SqlDriver { diff --git a/cmp-repository/src/commonMain/kotlin/repository/model/DayCoffee.kt b/cmp-repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt similarity index 51% rename from cmp-repository/src/commonMain/kotlin/repository/model/DayCoffee.kt rename to cmp-repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt index 291decd0..21962dce 100644 --- a/cmp-repository/src/commonMain/kotlin/repository/model/DayCoffee.kt +++ b/cmp-repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt @@ -1,18 +1,7 @@ -@file:Suppress("MatchingDeclarationName") - package repository.model import ru.beryukhov.repository.SqlDayCoffee data class DbDayCoffee(val date: String, val coffeeName: String, val count: Int) -internal fun DbDayCoffee.toRealm(): SqlDayCoffee { - val dc = this - return SqlDayCoffee( - date = dc.date, - coffeeName = dc.coffeeName, - count = dc.count.toLong(), - ) -} - internal fun SqlDayCoffee.toDb() = DbDayCoffee(date = date, coffeeName = coffeeName, count = count.toInt()) diff --git a/gradle.properties b/gradle.properties index 47322165..7ffe43b1 100644 --- a/gradle.properties +++ b/gradle.properties @@ -14,5 +14,3 @@ compose.desktop.verbose=true org.jetbrains.compose.experimental.uikit.enabled=true kotlin.mpp.enableCInteropCommonization=true - -kotlin.experimental.tryK2=true #left for realm plugin diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5233ba57..e7fcfe57 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,10 +4,12 @@ compileSdk = "34" minSdk = "24" wearMinSdk = "25" -kotlin = "2.0.0" # https://kotlinlang.org/docs/releases.html#release-details +kotlin = "2.0.20-Beta2" # https://kotlinlang.org/docs/releases.html#release-details agp = "8.5.1" # https://developer.android.com/studio/releases/gradle-plugin -realm = "2.0.0" # https://github.com/realm/realm-kotlin ktor = "2.3.12" # https://github.com/ktorio/ktor +androidxRoom = "2.7.0-alpha05" # https://developer.android.com/jetpack/androidx/releases/room +sqlite = "2.5.0-alpha05" # https://developer.android.com/jetpack/androidx/releases/sqlite +ksp = "2.0.20-Beta2-1.0.23" detekt = "1.23.6" # https://github.com/detekt/detekt detektCompose = "0.4.5" # https://github.com/mrmans0n/compose-rules @@ -35,16 +37,22 @@ protobuf = "4.27.2" [libraries] kotlinGradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } androidGradle = { module = "com.android.tools.build:gradle", version.ref = "agp" } -realmGradle = { module = "io.realm.kotlin:gradle-plugin", version.ref = "realm" } +roomGradle = { module = "androidx.room:androidx.room.gradle.plugin", version.ref = "androidxRoom" } detektGradle = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } composeKotlinGradle = { module = "org.jetbrains.kotlin:compose-compiler-gradle-plugin", version.ref = "kotlin" } protobufGradle = { module = "com.google.protobuf:protobuf-gradle-plugin", version = "0.9.4" } secretsGradle = "com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1" +ksp = { module = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin", version.ref = "ksp" } + detektFormatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } detektCompose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektCompose" } -realmKotlin = { module = "io.realm.kotlin:library-base", version.ref = "realm" } +room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "androidxRoom" } +room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "androidxRoom" } +sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } +sqlite = { module = "androidx.sqlite:sqlite", version.ref = "sqlite" } + compose-ui = { module = "androidx.compose.ui:ui", version.ref = "compose" } compose-material3 = "androidx.compose.material3:material3:1.2.1" # https://developer.android.com/jetpack/androidx/releases/compose-material3 diff --git a/repository/build.gradle.kts b/repository/build.gradle.kts index c42b31a8..7a0a0bbe 100644 --- a/repository/build.gradle.kts +++ b/repository/build.gradle.kts @@ -3,9 +3,9 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree plugins { kotlin("multiplatform") -// kotlin("native.cocoapods") id("com.android.library") - id("io.realm.kotlin") + id("androidx.room") + id("com.google.devtools.ksp") } version = "1.0" @@ -22,21 +22,15 @@ kotlin { iosArm64() iosSimulatorArm64() - /*cocoapods { - summary = "Repository for Coffegram" - homepage = "https://github.com/phansier/Coffeegram" - ios.deploymentTarget = "14.1" - framework { - baseName = "repository" - } - // set path to your ios project podfile, e.g. podfile = project.file("../iosApp/Podfile") - }*/ - sourceSets { commonMain.dependencies { + implementation(libs.room.runtime) + implementation(libs.sqlite.bundled) + implementation(libs.sqlite) - implementation(libs.realmKotlin) implementation(libs.coroutines.core) + + implementation(libs.koin.core) } commonTest.dependencies { implementation(kotlin("test-common")) @@ -63,3 +57,14 @@ android { sourceCompatibility = JavaVersion.VERSION_17 } } + +dependencies { + add("kspAndroid", libs.room.compiler) + add("kspIosSimulatorArm64", libs.room.compiler) + add("kspIosX64", libs.room.compiler) + add("kspIosArm64", libs.room.compiler) +} + +room { + schemaDirectory("$projectDir/schemas") +} diff --git a/repository/schemas/repository.room.AppDatabase/1.json b/repository/schemas/repository.room.AppDatabase/1.json new file mode 100644 index 00000000..bc003bb9 --- /dev/null +++ b/repository/schemas/repository.room.AppDatabase/1.json @@ -0,0 +1,49 @@ +{ + "formatVersion": 1, + "database": { + "version": 1, + "identityHash": "1c0cceb170206d2746a2cd0a0cc3af34", + "entities": [ + { + "tableName": "DayCoffee", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `date` TEXT NOT NULL, `coffeeName` TEXT NOT NULL, `count` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "coffeeName", + "columnName": "coffeeName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "count", + "columnName": "count", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + } + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '1c0cceb170206d2746a2cd0a0cc3af34')" + ] + } +} \ No newline at end of file diff --git a/repository/src/androidMain/kotlin/repository/room/AppDatabase.android.kt b/repository/src/androidMain/kotlin/repository/room/AppDatabase.android.kt new file mode 100644 index 00000000..ece0b2fe --- /dev/null +++ b/repository/src/androidMain/kotlin/repository/room/AppDatabase.android.kt @@ -0,0 +1,28 @@ +package repository.room + +import android.content.Context +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.sqlite.driver.bundled.BundledSQLiteDriver +import kotlinx.coroutines.Dispatchers +import org.koin.dsl.module + +actual fun roomModule() = module { + single { getDatabase(get()) } +} + +fun getDatabaseBuilder(ctx: Context): RoomDatabase.Builder { + val appContext = ctx.applicationContext + val dbFile = appContext.getDatabasePath("my_room.db") + return Room.databaseBuilder( + context = appContext, + name = dbFile.absolutePath + ) + + .setDriver(BundledSQLiteDriver()) + .setQueryCoroutineContext(Dispatchers.IO) +} + +fun getDatabase(ctx: Context): AppDatabase { + return getDatabaseBuilder(ctx).build() +} diff --git a/repository/src/androidUnitTest/kotlin/AndroidGreetingTest.kt b/repository/src/androidUnitTest/kotlin/AndroidGreetingTest.kt deleted file mode 100644 index 19f834ef..00000000 --- a/repository/src/androidUnitTest/kotlin/AndroidGreetingTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package ru.beryukhov.repository - -import org.junit.Test -import kotlin.test.assertEquals - -class AndroidGreetingTest { - - @Test - fun testExample() { - assertEquals(4, 2 + 2, "Sample test") - } -} diff --git a/repository/src/commonMain/kotlin/repository/CoffeeRepository.kt b/repository/src/commonMain/kotlin/repository/CoffeeRepository.kt index 8722496d..37a075f5 100644 --- a/repository/src/commonMain/kotlin/repository/CoffeeRepository.kt +++ b/repository/src/commonMain/kotlin/repository/CoffeeRepository.kt @@ -1,22 +1,23 @@ package repository -import io.realm.kotlin.Realm -import io.realm.kotlin.RealmConfiguration -import io.realm.kotlin.ext.query import repository.model.DbDayCoffee -import repository.model.RealmDayCoffee -import repository.model.toDb -import repository.model.toRealm - -class CoffeeRepository { - private val realm: Realm by lazy { - val configuration = RealmConfiguration.Builder(schema = setOf(RealmDayCoffee::class)).build() - Realm.open(configuration) +import repository.room.AppDatabase +import repository.room.DayCoffee +import repository.room.DayCoffeeDao + +interface CoffeeRepository { + suspend fun createOrUpdate(dbDateCoffees: List) + suspend fun getAll(): List +} + +class RoomCoffeeRepository(private val database: AppDatabase) : CoffeeRepository { + + private val dao: DayCoffeeDao by lazy { + database.getDao() } - // blocking - fun createOrUpdate(dbDateCoffees: List) { - val all = realm.query().find() + override suspend fun createOrUpdate(dbDateCoffees: List) { + val all = dao.getAll() if (all.isEmpty()) { create(dbDateCoffees) } else { @@ -24,37 +25,33 @@ class CoffeeRepository { } } - private fun create(dateCoffees: List) { + private suspend fun create(dateCoffees: List) { dateCoffees.forEach { - realm.writeBlocking { - this.copyToRealm(it.toRealm()) - } + dao.insert(DayCoffee(date = it.date, coffeeName = it.coffeeName, count = it.count)) } } - private fun update( + private suspend fun update( newCoffees: List, - oldCoffees: List + oldCoffees: List ) { - newCoffees.forEach { rdc -> - oldCoffees.firstOrNull { it.date == rdc.date && it.coffeeName == rdc.coffeeName && it.count != rdc.count } + newCoffees.forEach { new -> + oldCoffees.firstOrNull { old -> + old.date == new.date && + old.coffeeName == new.coffeeName && + old.count != new.count + } ?.also { old -> - // found RDC to update count - realm.writeBlocking { - findLatest(old)!!.count = rdc.count - } - } - oldCoffees.firstOrNull { it.date == rdc.date && it.coffeeName == rdc.coffeeName } - ?: run { - // coffee with this date and name was not found -> needs to be written - realm.writeBlocking { - this.copyToRealm(rdc.toRealm()) - } - } + // found DC to update count + dao.update(old.copy(count = new.count)) + } ?: run { + // coffee with this date and name was not found -> needs to be written + dao.insert(DayCoffee(date = new.date, coffeeName = new.coffeeName, count = new.count)) + } } } - fun getAll(): List { - return realm.query().find().map { it.toDb() } + override suspend fun getAll(): List { + return dao.getAll().map { DbDayCoffee(date = it.date, coffeeName = it.coffeeName, count = it.count) } } } diff --git a/repository/src/commonMain/kotlin/repository/model/DayCoffee.kt b/repository/src/commonMain/kotlin/repository/model/DayCoffee.kt deleted file mode 100644 index 4d7453de..00000000 --- a/repository/src/commonMain/kotlin/repository/model/DayCoffee.kt +++ /dev/null @@ -1,22 +0,0 @@ -package repository.model - -import io.realm.kotlin.types.RealmObject - -internal class RealmDayCoffee : RealmObject { - var date: String = "" - var coffeeName: String = "" - var count: Int = 0 -} - -data class DbDayCoffee(val date: String, val coffeeName: String, val count: Int) - -internal fun DbDayCoffee.toRealm(): RealmDayCoffee { - val dc = this - return RealmDayCoffee().apply { - date = dc.date - coffeeName = dc.coffeeName - count = dc.count - } -} - -internal fun RealmDayCoffee.toDb() = DbDayCoffee(date = date, coffeeName = coffeeName, count = count) diff --git a/repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt b/repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt new file mode 100644 index 00000000..d6c544f6 --- /dev/null +++ b/repository/src/commonMain/kotlin/repository/model/DbDayCoffee.kt @@ -0,0 +1,3 @@ +package repository.model + +data class DbDayCoffee(val date: String, val coffeeName: String, val count: Int) diff --git a/repository/src/commonMain/kotlin/repository/room/AppDatabase.kt b/repository/src/commonMain/kotlin/repository/room/AppDatabase.kt new file mode 100644 index 00000000..dfded26d --- /dev/null +++ b/repository/src/commonMain/kotlin/repository/room/AppDatabase.kt @@ -0,0 +1,12 @@ +package repository.room + +import androidx.room.Database +import androidx.room.RoomDatabase +import org.koin.core.module.Module + +@Database(entities = [DayCoffee::class], version = 1) +abstract class AppDatabase : RoomDatabase() { + abstract fun getDao(): DayCoffeeDao +} + +expect fun roomModule(): Module diff --git a/repository/src/commonMain/kotlin/repository/room/DayCoffeeDao.kt b/repository/src/commonMain/kotlin/repository/room/DayCoffeeDao.kt new file mode 100644 index 00000000..142a16ed --- /dev/null +++ b/repository/src/commonMain/kotlin/repository/room/DayCoffeeDao.kt @@ -0,0 +1,28 @@ +package repository.room + +import androidx.room.Dao +import androidx.room.Entity +import androidx.room.Insert +import androidx.room.PrimaryKey +import androidx.room.Query +import androidx.room.Update + +@Entity +data class DayCoffee( + @PrimaryKey(autoGenerate = true) val id: Long = 0, + val date: String, + val coffeeName: String, + val count: Int +) + +@Dao +interface DayCoffeeDao { + @Insert + suspend fun insert(item: DayCoffee) + + @Update + suspend fun update(item: DayCoffee) + + @Query("SELECT * FROM DayCoffee") + suspend fun getAll(): List +} diff --git a/repository/src/commonTest/kotlin/repository/CommonGreetingTest.kt b/repository/src/commonTest/kotlin/repository/CommonGreetingTest.kt deleted file mode 100644 index 87a14780..00000000 --- a/repository/src/commonTest/kotlin/repository/CommonGreetingTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package repository - -import kotlin.test.Test -import kotlin.test.assertEquals - -class CommonGreetingTest { - - @Test - fun commonTestExample() { - assertEquals(4, 2 + 2, "Sample test") - } -} diff --git a/repository/src/iosMain/kotlin/repository/room/AppDatabase.ios.kt b/repository/src/iosMain/kotlin/repository/room/AppDatabase.ios.kt new file mode 100644 index 00000000..97a9cfc1 --- /dev/null +++ b/repository/src/iosMain/kotlin/repository/room/AppDatabase.ios.kt @@ -0,0 +1,27 @@ +package repository.room + +import androidx.room.Room +import androidx.room.RoomDatabase +import androidx.sqlite.driver.bundled.BundledSQLiteDriver +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.IO +import org.koin.dsl.module +import platform.Foundation.NSHomeDirectory + +actual fun roomModule() = module { + single { getDatabase() } +} + +fun getDatabaseBuilder(): RoomDatabase.Builder { + val dbFilePath = NSHomeDirectory() + "/my_room.db" + return Room.databaseBuilder( + name = dbFilePath, + factory = { AppDatabase::class.instantiateImpl() } + ) + .setDriver(BundledSQLiteDriver()) + .setQueryCoroutineContext(Dispatchers.IO) +} + +fun getDatabase(): AppDatabase { + return getDatabaseBuilder().build() +} diff --git a/repository/src/iosTest/kotlin/repository/IosGreetingTest.kt b/repository/src/iosTest/kotlin/repository/IosGreetingTest.kt deleted file mode 100644 index 69a301d7..00000000 --- a/repository/src/iosTest/kotlin/repository/IosGreetingTest.kt +++ /dev/null @@ -1,10 +0,0 @@ -package repository - -import kotlin.test.Test - -class IosGreetingTest { - - @Test - fun testExample() { - } -}