From f57d23026b5a426e8ecd90d850bdfc12ba5c2139 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 17 Jan 2023 08:17:43 +0200 Subject: [PATCH] Update room --- app/build.gradle | 8 +++--- .../kotatsu/core/db/dao/PreferencesDao.kt | 14 ++-------- .../koitharu/kotatsu/core/db/dao/TagsDao.kt | 26 +++++-------------- .../favourites/data/FavouriteCategoriesDao.kt | 11 ++------ .../kotatsu/favourites/data/FavouritesDao.kt | 14 +++------- .../kotatsu/settings/backup/BackupObserver.kt | 6 ++--- .../tracker/TrackerSettingsViewModel.kt | 4 +-- .../kotatsu/sync/domain/SyncController.kt | 2 +- .../koitharu/kotatsu/sync/ui/SyncProvider.kt | 12 ++++----- .../kotatsu/tracker/data/TracksDao.kt | 18 +++---------- .../koitharu/kotatsu/widget/WidgetUpdater.kt | 6 ++--- 11 files changed, 35 insertions(+), 86 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1554f0c21..94d3290fe 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -108,9 +108,9 @@ dependencies { //noinspection LifecycleAnnotationProcessorWithJava8 kapt 'androidx.lifecycle:lifecycle-compiler:2.5.1' - implementation 'androidx.room:room-runtime:2.4.3' - implementation 'androidx.room:room-ktx:2.4.3' - kapt 'androidx.room:room-compiler:2.4.3' + implementation 'androidx.room:room-runtime:2.5.0' + implementation 'androidx.room:room-ktx:2.5.0' + kapt 'androidx.room:room-compiler:2.5.0' implementation 'com.squareup.okhttp3:okhttp:4.10.0' implementation 'com.squareup.okhttp3:okhttp-dnsoverhttps:4.9.3' @@ -145,7 +145,7 @@ dependencies { androidTestImplementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4' - androidTestImplementation 'androidx.room:room-testing:2.4.3' + androidTestImplementation 'androidx.room:room-testing:2.5.0' androidTestImplementation 'com.squareup.moshi:moshi-kotlin:1.14.0' androidTestImplementation 'com.google.dagger:hilt-android-testing:2.44.2' diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt index b0c48b39c..d79b37b3a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/PreferencesDao.kt @@ -13,16 +13,6 @@ abstract class PreferencesDao { @Query("SELECT * FROM preferences WHERE manga_id = :mangaId") abstract fun observe(mangaId: Long): Flow - @Insert(onConflict = OnConflictStrategy.IGNORE) - abstract suspend fun insert(pref: MangaPrefsEntity): Long - - @Update - abstract suspend fun update(pref: MangaPrefsEntity): Int - - @Transaction - open suspend fun upsert(pref: MangaPrefsEntity) { - if (update(pref) == 0) { - insert(pref) - } - } + @Upsert + abstract suspend fun upsert(pref: MangaPrefsEntity) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt index 8b3498e3c..e84ffa352 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/db/dao/TagsDao.kt @@ -14,7 +14,7 @@ abstract class TagsDao { LEFT JOIN manga_tags ON tags.tag_id = manga_tags.tag_id GROUP BY tags.title ORDER BY COUNT(manga_id) DESC - LIMIT :limit""" + LIMIT :limit""", ) abstract suspend fun findPopularTags(limit: Int): List @@ -24,7 +24,7 @@ abstract class TagsDao { WHERE tags.source = :source GROUP BY tags.title ORDER BY COUNT(manga_id) DESC - LIMIT :limit""" + LIMIT :limit""", ) abstract suspend fun findPopularTags(source: String, limit: Int): List @@ -34,7 +34,7 @@ abstract class TagsDao { WHERE tags.source = :source AND title LIKE :query GROUP BY tags.title ORDER BY COUNT(manga_id) DESC - LIMIT :limit""" + LIMIT :limit""", ) abstract suspend fun findTags(source: String, query: String, limit: Int): List @@ -44,22 +44,10 @@ abstract class TagsDao { WHERE title LIKE :query GROUP BY tags.title ORDER BY COUNT(manga_id) DESC - LIMIT :limit""" + LIMIT :limit""", ) abstract suspend fun findTags(query: String, limit: Int): List - @Insert(onConflict = OnConflictStrategy.IGNORE) - abstract suspend fun insert(tag: TagEntity): Long - - @Update(onConflict = OnConflictStrategy.IGNORE) - abstract suspend fun update(tag: TagEntity): Int - - @Transaction - open suspend fun upsert(tags: Iterable) { - tags.forEach { tag -> - if (update(tag) <= 0) { - insert(tag) - } - } - } -} \ No newline at end of file + @Upsert + abstract suspend fun upsert(tags: Iterable) +} diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt index 88325d1bb..606785b10 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouriteCategoriesDao.kt @@ -21,9 +21,6 @@ abstract class FavouriteCategoriesDao { @Insert(onConflict = OnConflictStrategy.ABORT) abstract suspend fun insert(category: FavouriteCategoryEntity): Long - @Update - abstract suspend fun update(category: FavouriteCategoryEntity): Int - suspend fun delete(id: Long) = setDeletedAt(id, System.currentTimeMillis()) @Query("UPDATE favourite_categories SET title = :title, `order` = :order, `track` = :tracker WHERE category_id = :id") @@ -51,12 +48,8 @@ abstract class FavouriteCategoriesDao { return (getMaxSortKey() ?: 0) + 1 } - @Transaction - open suspend fun upsert(entity: FavouriteCategoryEntity) { - if (update(entity) == 0) { - insert(entity) - } - } + @Upsert + abstract suspend fun upsert(entity: FavouriteCategoryEntity) @Query("UPDATE favourite_categories SET deleted_at = :deletedAt WHERE category_id = :id") protected abstract suspend fun setDeletedAt(id: Long, deletedAt: Long) diff --git a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt index 18bfef6cf..0e0ee05de 100644 --- a/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/favourites/data/FavouritesDao.kt @@ -99,11 +99,6 @@ abstract class FavouritesDao { @Insert(onConflict = OnConflictStrategy.REPLACE) abstract suspend fun insert(favourite: FavouriteEntity) - /** UPDATE **/ - - @Update - abstract suspend fun update(favourite: FavouriteEntity): Int - /** DELETE **/ suspend fun delete(mangaId: Long) = setDeletedAt( @@ -138,12 +133,8 @@ abstract class FavouritesDao { /** TOOLS **/ - @Transaction - open suspend fun upsert(entity: FavouriteEntity) { - if (update(entity) == 0) { - insert(entity) - } - } + @Upsert + abstract suspend fun upsert(entity: FavouriteEntity) @Transaction @RawQuery(observedEntities = [FavouriteEntity::class]) @@ -166,6 +157,7 @@ abstract class FavouritesDao { SortOrder.NEWEST, SortOrder.UPDATED, -> "created_at DESC" + SortOrder.ALPHABETICAL -> "title ASC" else -> throw IllegalArgumentException("Sort order $sortOrder is not supported") } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupObserver.kt b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupObserver.kt index 1e8c5d21b..595c27e88 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupObserver.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/backup/BackupObserver.kt @@ -4,11 +4,11 @@ import android.app.backup.BackupManager import android.content.Context import androidx.room.InvalidationTracker import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton import org.koitharu.kotatsu.core.db.TABLE_FAVOURITES import org.koitharu.kotatsu.core.db.TABLE_FAVOURITE_CATEGORIES import org.koitharu.kotatsu.core.db.TABLE_HISTORY +import javax.inject.Inject +import javax.inject.Singleton @Singleton class BackupObserver @Inject constructor( @@ -17,7 +17,7 @@ class BackupObserver @Inject constructor( private val backupManager = BackupManager(context) - override fun onInvalidated(tables: MutableSet) { + override fun onInvalidated(tables: Set) { backupManager.dataChanged() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt index 0c32ba5cf..3c6776347 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/tracker/TrackerSettingsViewModel.kt @@ -3,7 +3,6 @@ package org.koitharu.kotatsu.settings.tracker import androidx.lifecycle.MutableLiveData import androidx.room.InvalidationTracker import dagger.hilt.android.lifecycle.HiltViewModel -import javax.inject.Inject import kotlinx.coroutines.Dispatchers import okio.Closeable import org.koitharu.kotatsu.base.ui.BaseViewModel @@ -11,6 +10,7 @@ import org.koitharu.kotatsu.core.db.MangaDatabase import org.koitharu.kotatsu.core.db.TABLE_FAVOURITE_CATEGORIES import org.koitharu.kotatsu.core.db.removeObserverAsync import org.koitharu.kotatsu.tracker.domain.TrackingRepository +import javax.inject.Inject @HiltViewModel class TrackerSettingsViewModel @Inject constructor( @@ -39,7 +39,7 @@ class TrackerSettingsViewModel @Inject constructor( InvalidationTracker.Observer(arrayOf(TABLE_FAVOURITE_CATEGORIES)), Closeable { - override fun onInvalidated(tables: MutableSet) { + override fun onInvalidated(tables: Set) { vm?.updateCategoriesCount() } diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt b/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt index c0c00aeab..58ff58b2f 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/domain/SyncController.kt @@ -44,7 +44,7 @@ class SyncController @Inject constructor( private val defaultGcPeriod: Long // gc period if sync disabled get() = TimeUnit.HOURS.toMillis(2) - override fun onInvalidated(tables: MutableSet) { + override fun onInvalidated(tables: Set) { requestSync( favourites = TABLE_FAVOURITES in tables || TABLE_FAVOURITE_CATEGORIES in tables, history = TABLE_HISTORY in tables, diff --git a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncProvider.kt b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncProvider.kt index 05ca3b38e..33faa46f4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/sync/ui/SyncProvider.kt @@ -11,11 +11,10 @@ import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteQueryBuilder import dagger.hilt.EntryPoint import dagger.hilt.InstallIn -import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.EntryPointAccessors import dagger.hilt.components.SingletonComponent -import java.util.concurrent.Callable import org.koitharu.kotatsu.core.db.* +import java.util.concurrent.Callable abstract class SyncProvider : ContentProvider() { @@ -44,15 +43,14 @@ abstract class SyncProvider : ContentProvider() { selection: String?, selectionArgs: Array?, sortOrder: String?, - ): Cursor? = if (getTableName(uri) != null) { - val sqlQuery = SupportSQLiteQueryBuilder.builder(uri.lastPathSegment) + ): Cursor? { + val tableName = getTableName(uri) ?: return null + val sqlQuery = SupportSQLiteQueryBuilder.builder(tableName) .columns(projection) .selection(selection, selectionArgs) .orderBy(sortOrder) .create() - database.openHelper.readableDatabase.query(sqlQuery) - } else { - null + return database.openHelper.readableDatabase.query(sqlQuery) } override fun getType(uri: Uri): String? { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/data/TracksDao.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/data/TracksDao.kt index d00ce5fc5..0915582a1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/data/TracksDao.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/data/TracksDao.kt @@ -1,12 +1,10 @@ package org.koitharu.kotatsu.tracker.data import androidx.room.Dao -import androidx.room.Insert import androidx.room.MapInfo -import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Transaction -import androidx.room.Update +import androidx.room.Upsert import kotlinx.coroutines.flow.Flow import org.koitharu.kotatsu.core.db.entity.MangaWithTags @@ -46,22 +44,12 @@ abstract class TracksDao { @Query("UPDATE tracks SET chapters_new = 0") abstract suspend fun clearCounters() - @Insert(onConflict = OnConflictStrategy.IGNORE) - abstract suspend fun insert(entity: TrackEntity): Long - - @Update - abstract suspend fun update(entity: TrackEntity): Int - @Query("DELETE FROM tracks WHERE manga_id = :mangaId") abstract suspend fun delete(mangaId: Long) @Query("DELETE FROM tracks WHERE manga_id NOT IN (SELECT manga_id FROM history UNION SELECT manga_id FROM favourites)") abstract suspend fun gc() - @Transaction - open suspend fun upsert(entity: TrackEntity) { - if (update(entity) == 0) { - insert(entity) - } - } + @Upsert + abstract suspend fun upsert(entity: TrackEntity) } diff --git a/app/src/main/java/org/koitharu/kotatsu/widget/WidgetUpdater.kt b/app/src/main/java/org/koitharu/kotatsu/widget/WidgetUpdater.kt index 6fff7b8ac..c5fd21e71 100644 --- a/app/src/main/java/org/koitharu/kotatsu/widget/WidgetUpdater.kt +++ b/app/src/main/java/org/koitharu/kotatsu/widget/WidgetUpdater.kt @@ -6,19 +6,19 @@ import android.content.Context import android.content.Intent import androidx.room.InvalidationTracker import dagger.hilt.android.qualifiers.ApplicationContext -import javax.inject.Inject -import javax.inject.Singleton import org.koitharu.kotatsu.core.db.TABLE_FAVOURITES import org.koitharu.kotatsu.core.db.TABLE_HISTORY import org.koitharu.kotatsu.widget.recent.RecentWidgetProvider import org.koitharu.kotatsu.widget.shelf.ShelfWidgetProvider +import javax.inject.Inject +import javax.inject.Singleton @Singleton class WidgetUpdater @Inject constructor( @ApplicationContext private val context: Context, ) : InvalidationTracker.Observer(TABLE_HISTORY, TABLE_FAVOURITES) { - override fun onInvalidated(tables: MutableSet) { + override fun onInvalidated(tables: Set) { if (TABLE_HISTORY in tables) { updateWidgets(RecentWidgetProvider::class.java) }