-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathAppDb.kt
More file actions
101 lines (91 loc) · 3.06 KB
/
AppDb.kt
File metadata and controls
101 lines (91 loc) · 3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package to.bitkit.data
import android.content.Context
import androidx.hilt.work.HiltWorker
import androidx.room.Dao
import androidx.room.Database
import androidx.room.Query
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import androidx.room.Upsert
import androidx.sqlite.db.SupportSQLiteDatabase
import androidx.work.CoroutineWorker
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.Flow
import to.bitkit.BuildConfig
import to.bitkit.data.dao.TransferDao
import to.bitkit.data.entities.ConfigEntity
import to.bitkit.data.entities.TransferEntity
import to.bitkit.data.typeConverters.StringListConverter
@Database(
entities = [
ConfigEntity::class,
TransferEntity::class,
],
version = 5,
)
@TypeConverters(StringListConverter::class)
abstract class AppDb : RoomDatabase() {
abstract fun configDao(): ConfigDao
abstract fun transferDao(): TransferDao
companion object {
private const val DB_NAME = "${BuildConfig.APPLICATION_ID}.sqlite"
@Volatile
private var instance: AppDb? = null
fun getInstance(context: Context): AppDb {
return instance ?: synchronized(this) {
instance ?: buildDatabase(context).also {
instance = it
}
}
}
private fun buildDatabase(context: Context): AppDb {
return Room.databaseBuilder(context, AppDb::class.java, DB_NAME)
.setJournalMode(JournalMode.TRUNCATE)
.fallbackToDestructiveMigration() // TODO remove in prod
.addCallback(object : Callback() {
override fun onCreate(db: SupportSQLiteDatabase) {
super.onCreate(db)
val request = OneTimeWorkRequestBuilder<SeedDbWorker>().build()
try {
WorkManager.getInstance(context).enqueue(request)
} catch (_: Exception) {
// ignore - occurs in ui tests
}
}
})
.build()
}
}
}
@HiltWorker
class SeedDbWorker @AssistedInject constructor(
@Assisted context: Context,
@Assisted workerParams: WorkerParameters,
) : CoroutineWorker(context, workerParams) {
override suspend fun doWork(): Result = coroutineScope {
try {
val db = AppDb.getInstance(applicationContext)
db.configDao().upsert(
ConfigEntity(
walletIndex = 0L,
),
)
Result.success()
} catch (_: Exception) {
Result.failure()
}
}
}
@Dao
interface ConfigDao {
@Query("SELECT * FROM config")
fun getAll(): Flow<List<ConfigEntity>>
@Upsert
suspend fun upsert(vararg entities: ConfigEntity)
}