diff options
Diffstat (limited to 'app/src/main')
-rw-r--r-- | app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt index ff64f5eb..44e62938 100644 --- a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt +++ b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt @@ -33,6 +33,8 @@ import com.raizlabs.android.dbflow.kotlinextensions.fastSave import com.raizlabs.android.dbflow.kotlinextensions.from import com.raizlabs.android.dbflow.kotlinextensions.select import com.raizlabs.android.dbflow.structure.BaseModel +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.withContext /** * Created by Allan Wang on 2017-05-30. @@ -52,21 +54,26 @@ interface FbTabDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun _insertAll(items: List<FbTabEntity>) - - @Transaction - suspend fun _save(items: List<FbTabEntity>) { - _deleteAll() - _insertAll(items) - } } +/** + * Saving tabs operates by deleting all db items and saving the new list. + * Transactions can't be done with suspensions in room as switching threads during the process + * may result in a deadlock. + * In this case, there may be a chance that the 'transaction' completes partially, + * but we'll just fallback to the default anyways. + */ suspend fun FbTabDao.save(items: List<FbItem>) { - _save((items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem -> - FbTabEntity( - index, - fbItem - ) - }) + withContext(NonCancellable) { + _deleteAll() + val entities = (items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem -> + FbTabEntity( + index, + fbItem + ) + } + _insertAll(entities) + } } suspend fun FbTabDao.selectAll(): List<FbItem> = _selectAll().map { it.tab }.takeIf { it.isNotEmpty() } ?: defaultTabs() |