No more main thread SQL

This commit is contained in:
Mygod
2019-01-31 22:11:54 +08:00
parent 08ab6a54ff
commit 4de891b459
7 changed files with 30 additions and 12 deletions

View File

@@ -19,7 +19,6 @@ abstract class AppDatabase : RoomDatabase() {
.addMigrations(
Migration2
)
.allowMainThreadQueries()
.build()
}
}

View File

@@ -2,6 +2,10 @@ package be.mygod.vpnhotspot.room
import androidx.lifecycle.LiveData
import androidx.room.*
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
@Entity
data class ClientRecord(@PrimaryKey
@@ -20,13 +24,17 @@ data class ClientRecord(@PrimaryKey
abstract fun lookupSync(mac: Long): LiveData<ClientRecord>
@Insert(onConflict = OnConflictStrategy.REPLACE)
protected abstract fun updateInternal(value: ClientRecord): Long
fun update(value: ClientRecord) = check(updateInternal(value) == value.mac)
protected abstract suspend fun updateInternal(value: ClientRecord): Long
suspend fun update(value: ClientRecord) = check(updateInternal(value) == value.mac)
@Transaction
open suspend fun upsert(mac: Long, operation: ClientRecord.() -> Unit) = lookupOrDefault(mac).apply {
operation()
update(this)
protected open fun upsertSync(mac: Long, operation: ClientRecord.() -> Unit) = runBlocking {
lookupOrDefault(mac).apply {
operation()
update(this)
}
}
fun upsert(mac: Long, operation: ClientRecord.() -> Unit) =
GlobalScope.async(Dispatchers.IO) { upsertSync(mac, operation) }
}
}

View File

@@ -40,8 +40,8 @@ data class TrafficRecord(
@androidx.room.Dao
abstract class Dao {
@Insert
protected abstract fun insertInternal(value: TrafficRecord): Long
fun insert(value: TrafficRecord) {
protected abstract suspend fun insertInternal(value: TrafficRecord): Long
suspend fun insert(value: TrafficRecord) {
check(value.id == null)
value.id = insertInternal(value)
}