Skip to content

Commit 1ca3284

Browse files
committed
persistence/sqldelight support
1 parent 735a049 commit 1ca3284

13 files changed

Lines changed: 114 additions & 8 deletions

File tree

app/src/main/java/com/surrus/peopleinspace/PeopleInSpaceApplication.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.surrus.peopleinspace
22

33
import android.app.Application
4+
import com.surrus.common.repository.appContext
45
import com.surrus.peopleinspace.di.appModule
56
import org.koin.android.ext.koin.androidContext
67
import org.koin.android.ext.koin.androidLogger
@@ -11,6 +12,8 @@ class PeopleInSpaceApplication : Application() {
1112
override fun onCreate() {
1213
super.onCreate()
1314

15+
appContext = this
16+
1417
startKoin {
1518
androidLogger()
1619
androidContext(this@PeopleInSpaceApplication)

app/src/main/java/com/surrus/peopleinspace/ui/PeopleInSpaceViewModel.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@ import androidx.lifecycle.ViewModel
55
import androidx.lifecycle.viewModelScope
66
import com.surrus.common.remote.Assignment
77
import com.surrus.common.repository.PeopleInSpaceRepository
8+
import kotlinx.coroutines.flow.collect
89
import kotlinx.coroutines.launch
910

1011
class PeopleInSpaceViewModel(peopleInSpaceRepository: PeopleInSpaceRepository) : ViewModel() {
1112
val peopleInSpace = MutableLiveData<List<Assignment>>(emptyList())
1213

1314
init {
1415
viewModelScope.launch {
15-
val people = peopleInSpaceRepository.fetchPeople()
16-
peopleInSpace.value = people
16+
peopleInSpaceRepository.fetchPeopleAsFlow().collect {
17+
peopleInSpace.value = it
18+
}
1719
}
20+
1821
}
1922
}

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ buildscript {
1010
classpath "com.android.tools.build:gradle:${Versions.androidBuildToolsVersion}"
1111
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${Versions.kotlin}"
1212
classpath "org.jetbrains.kotlin:kotlin-serialization:${Versions.kotlin}"
13+
classpath "com.squareup.sqldelight:gradle-plugin:${Versions.sqlDelight}"
1314
}
1415
}
1516

buildSrc/src/main/java/Dependencies.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11

22
object Versions {
3-
const val androidBuildToolsVersion = "4.0.0-alpha08"
3+
const val androidBuildToolsVersion = "4.0.0-alpha09"
44

55
const val kotlin = "1.3.61"
66
const val kotlinCoroutines = "1.3.3"
77
const val koin = "2.0.0"
88
const val ktor = "1.3.0-rc"
99
const val kotlinxSerialization = "0.14.0"
10-
const val sqlDelight = "1.2.0"
10+
const val sqlDelight = "1.2.2"
1111
const val retrofit = "2.4.0"
1212
const val okHttp = "3.12.0"
1313
const val ktx = "1.0.1"

common/build.gradle

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ apply plugin: 'com.android.library'
22
apply plugin: 'kotlin-multiplatform'
33
apply plugin: 'kotlinx-serialization'
44
apply plugin: 'org.jetbrains.kotlin.native.cocoapods'
5-
5+
apply plugin: "com.squareup.sqldelight"
66

77

88
android {
@@ -74,6 +74,10 @@ kotlin {
7474

7575
// Serialize
7676
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-common:${Versions.kotlinxSerialization}"
77+
78+
// SQL Delight
79+
implementation "com.squareup.sqldelight:runtime:${Versions.sqlDelight}"
80+
implementation "com.squareup.sqldelight:coroutines-extensions:${Versions.sqlDelight}"
7781
}
7882

7983
androidMain.dependencies {
@@ -93,6 +97,10 @@ kotlin {
9397

9498
// Serialize
9599
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:${Versions.kotlinxSerialization}"
100+
101+
// SQL Delight
102+
implementation "com.squareup.sqldelight:android-driver:${Versions.sqlDelight}"
103+
implementation "com.squareup.sqldelight:coroutines-extensions-jvm:${Versions.sqlDelight}"
96104
}
97105

98106
iOSMain.dependencies {
@@ -113,6 +121,9 @@ kotlin {
113121

114122
// Serialize
115123
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:${Versions.kotlinxSerialization}"
124+
125+
// SQL Delight
126+
implementation "com.squareup.sqldelight:native-driver:${Versions.sqlDelight}"
116127
}
117128

118129
watchMain.dependencies {
@@ -132,6 +143,16 @@ kotlin {
132143

133144
// Serialize
134145
implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:${Versions.kotlinxSerialization}"
146+
147+
// SQL Delight
148+
implementation "com.squareup.sqldelight:native-driver:${Versions.sqlDelight}"
135149
}
136150
}
137151
}
152+
153+
sqldelight {
154+
PeopleInSpaceDatabase {
155+
packageName = "com.surrus.peopleinspace.db"
156+
sourceFolders = ["sqldelight"]
157+
}
158+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.surrus.common.repository
2+
3+
import android.content.Context
4+
import com.squareup.sqldelight.android.AndroidSqliteDriver
5+
import com.surrus.peopleinspace.db.PeopleInSpaceDatabase
6+
7+
8+
lateinit var appContext: Context
9+
10+
actual fun createDb(): PeopleInSpaceDatabase {
11+
val driver = AndroidSqliteDriver(PeopleInSpaceDatabase.Schema, appContext, "peopleinspace.db")
12+
return PeopleInSpaceDatabase(driver)
13+
}
Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,45 @@
11
package com.surrus.common.repository
22

3+
import com.squareup.sqldelight.runtime.coroutines.asFlow
4+
import com.squareup.sqldelight.runtime.coroutines.mapToList
35
import com.surrus.common.remote.Assignment
46
import com.surrus.common.remote.PeopleInSpaceApi
7+
import com.surrus.peopleinspace.db.PeopleInSpaceDatabase
58
import kotlinx.coroutines.Dispatchers
69
import kotlinx.coroutines.GlobalScope
10+
import kotlinx.coroutines.flow.collect
711
import kotlinx.coroutines.launch
812

13+
expect fun createDb() : PeopleInSpaceDatabase
14+
915
class PeopleInSpaceRepository {
1016
private val peopleInSpaceApi = PeopleInSpaceApi()
17+
private val peopleInSpaceDatabase = createDb()
18+
private val peopleInSpaceQueries = peopleInSpaceDatabase.peopleInSpaceQueries
19+
20+
init {
21+
GlobalScope.launch (Dispatchers.Main) {
22+
fetchAndStorePeople()
23+
}
24+
}
25+
26+
fun fetchPeopleAsFlow() = peopleInSpaceQueries.selectAll(mapper = { name, craft ->
27+
Assignment(name = name, craft = craft)
28+
}).asFlow().mapToList()
1129

12-
suspend fun fetchPeople() : List<Assignment> {
30+
suspend fun fetchAndStorePeople() {
1331
val result = peopleInSpaceApi.fetchPeople()
14-
return result.people
32+
result.people.forEach {
33+
peopleInSpaceQueries.insertItem(it.name, it.craft)
34+
}
1535
}
1636

37+
// called from iOS/watchOS client
1738
fun fetchPeople(success: (List<Assignment>) -> Unit) {
1839
GlobalScope.launch(Dispatchers.Main) {
19-
success(fetchPeople())
40+
fetchPeopleAsFlow().collect {
41+
success(it)
42+
}
2043
}
2144
}
2245
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
CREATE TABLE People(
3+
name TEXT NOT NULL PRIMARY KEY,
4+
craft TEXT NOT NULL
5+
);
6+
7+
insertItem:
8+
INSERT OR REPLACE INTO People(name, craft)VALUES(?,?);
9+
10+
selectAll:
11+
SELECT * FROM People;
12+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.surrus.common.repository
2+
3+
import com.squareup.sqldelight.drivers.native.NativeSqliteDriver
4+
import com.surrus.peopleinspace.db.PeopleInSpaceDatabase
5+
6+
actual fun createDb(): PeopleInSpaceDatabase {
7+
val driver = NativeSqliteDriver(PeopleInSpaceDatabase.Schema, "peopleinspace.db")
8+
return PeopleInSpaceDatabase(driver)
9+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.surrus.common.repository
2+
3+
import com.squareup.sqldelight.drivers.native.NativeSqliteDriver
4+
import com.surrus.peopleinspace.db.PeopleInSpaceDatabase
5+
6+
actual fun createDb(): PeopleInSpaceDatabase {
7+
val driver = NativeSqliteDriver(PeopleInSpaceDatabase.Schema, "peopleinspace.db")
8+
return PeopleInSpaceDatabase(driver)
9+
}

0 commit comments

Comments
 (0)