code-style fix, fix db code structure
This commit is contained in:
@@ -2,9 +2,9 @@ package ru.fincode.tsudesk.core.database
|
||||
|
||||
import androidx.room.Database
|
||||
import androidx.room.RoomDatabase
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleDao
|
||||
import ru.fincode.tsudesk.core.database.schedule.LessonCacheEntity
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleCacheEntity
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleDao
|
||||
|
||||
@Database(
|
||||
entities = [
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
package ru.fincode.tsudesk.core.database.builder
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Room
|
||||
import ru.fincode.tsudesk.core.database.AppDatabase
|
||||
|
||||
object AppDatabaseBuilder {
|
||||
|
||||
private const val DB_NAME = "tsudesk.db"
|
||||
|
||||
fun build(context: Context): AppDatabase =
|
||||
Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME)
|
||||
.fallbackToDestructiveMigration()
|
||||
.build()
|
||||
}
|
||||
@@ -1,13 +1,13 @@
|
||||
package ru.fincode.tsudesk.core.database.di
|
||||
|
||||
import android.content.Context
|
||||
import androidx.room.Room
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.android.qualifiers.ApplicationContext
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import ru.fincode.tsudesk.core.database.AppDatabase
|
||||
import ru.fincode.tsudesk.core.database.builder.AppDatabaseBuilder
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleDao
|
||||
import javax.inject.Singleton
|
||||
|
||||
@@ -15,16 +15,12 @@ import javax.inject.Singleton
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object DatabaseModule {
|
||||
|
||||
private const val DB_NAME = "tsudesk.db"
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase =
|
||||
Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME)
|
||||
.fallbackToDestructiveMigration()
|
||||
.build()
|
||||
AppDatabaseBuilder.build(context)
|
||||
|
||||
@Provides
|
||||
fun provideScheduleCacheDao(db: AppDatabase): ScheduleDao =
|
||||
fun provideScheduleDao(db: AppDatabase): ScheduleDao =
|
||||
db.scheduleCacheDao()
|
||||
}
|
||||
|
||||
@@ -6,4 +6,8 @@ object ScheduleDbConstants {
|
||||
|
||||
const val COL_SCHEDULE_KEY = "scheduleKey"
|
||||
const val COL_KEY = "key"
|
||||
|
||||
const val GROUP_PRE_KEY = "group:"
|
||||
const val TEACHER_PRE_KEY = "teacher:"
|
||||
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package ru.fincode.tsudesk.core.database.schedule
|
||||
|
||||
object Query {
|
||||
|
||||
const val SELECT_LESSON_BY_KEY_QUERY =
|
||||
"SELECT * FROM lesson_cache WHERE scheduleKey = :key"
|
||||
|
||||
const val SELECT_SCHEDULE_BY_KEY_QUERY =
|
||||
"SELECT * FROM schedule_cache WHERE `key` = :key LIMIT 1"
|
||||
|
||||
const val DELETE_LESSON_BY_GROUP_KEY_QUERY =
|
||||
"DELETE FROM lesson_cache WHERE scheduleKey = :key"
|
||||
}
|
||||
@@ -6,48 +6,40 @@ import androidx.room.Insert
|
||||
import androidx.room.OnConflictStrategy
|
||||
import androidx.room.Query
|
||||
import androidx.room.Transaction
|
||||
import ru.fincode.tsudesk.core.database.schedule.Query.DELETE_LESSON_BY_GROUP_KEY_QUERY
|
||||
import ru.fincode.tsudesk.core.database.schedule.Query.SELECT_LESSON_BY_KEY_QUERY
|
||||
import ru.fincode.tsudesk.core.database.schedule.Query.SELECT_SCHEDULE_BY_KEY_QUERY
|
||||
|
||||
@Dao
|
||||
interface ScheduleDao {
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
@Insert(onConflict = OnConflictStrategy.Companion.REPLACE)
|
||||
suspend fun upsertSchedule(schedule: ScheduleCacheEntity)
|
||||
|
||||
@Insert(onConflict = OnConflictStrategy.REPLACE)
|
||||
@Insert(onConflict = OnConflictStrategy.Companion.REPLACE)
|
||||
suspend fun insertLessons(lessons: List<LessonCacheEntity>)
|
||||
|
||||
|
||||
@Query("SELECT * FROM schedule_cache WHERE `key` = :key LIMIT 1")
|
||||
@Query(SELECT_SCHEDULE_BY_KEY_QUERY)
|
||||
suspend fun getSchedule(key: String): ScheduleCacheEntity?
|
||||
|
||||
@Query("SELECT * FROM lesson_cache WHERE scheduleKey = :key")
|
||||
@Query(SELECT_LESSON_BY_KEY_QUERY)
|
||||
suspend fun getLessons(key: String): List<LessonCacheEntity>
|
||||
|
||||
// Bulk delete уроков по ключу — самый простой/эффективный путь в Room это @Query
|
||||
@Query("DELETE FROM lesson_cache WHERE scheduleKey = :key")
|
||||
@Query(DELETE_LESSON_BY_GROUP_KEY_QUERY)
|
||||
suspend fun deleteLessonsByKey(key: String)
|
||||
|
||||
// Удаление schedule_cache без SQL: типобезопасно
|
||||
@Delete
|
||||
suspend fun deleteSchedule(entity: ScheduleCacheEntity)
|
||||
|
||||
/**
|
||||
* Обновить кэш расписания (header + lessons) атомарно.
|
||||
*/
|
||||
@Transaction
|
||||
suspend fun replaceSchedule(
|
||||
key: String,
|
||||
schedule: ScheduleCacheEntity,
|
||||
lessons: List<LessonCacheEntity>
|
||||
key: String, schedule: ScheduleCacheEntity, lessons: List<LessonCacheEntity>
|
||||
) {
|
||||
upsertSchedule(schedule)
|
||||
deleteLessonsByKey(key)
|
||||
insertLessons(lessons)
|
||||
}
|
||||
|
||||
/**
|
||||
* Полная очистка кэша по ключу без прямого DELETE для schedule_cache.
|
||||
*/
|
||||
@Transaction
|
||||
suspend fun clearSchedule(key: String) {
|
||||
deleteLessonsByKey(key)
|
||||
|
||||
@@ -19,7 +19,7 @@ class ScheduleRepositoryImpl @Inject constructor(
|
||||
override suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleEntity> {
|
||||
val result = remote.loadScheduleByGroup(number).map(mapper::invoke)
|
||||
if (result is NetworkResult.Success) {
|
||||
local.save(ScheduleCacheKey.group(number), result.data)
|
||||
local.saveSchedule(ScheduleCacheKey.group(number), result.data)
|
||||
}
|
||||
return result
|
||||
}
|
||||
@@ -27,7 +27,7 @@ class ScheduleRepositoryImpl @Inject constructor(
|
||||
override suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleEntity> {
|
||||
val result = remote.loadScheduleByTeacher(name).map(mapper::invoke)
|
||||
if (result is NetworkResult.Success) {
|
||||
local.save(ScheduleCacheKey.teacher(name), result.data)
|
||||
local.saveSchedule(ScheduleCacheKey.teacher(name), result.data)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ package ru.fincode.tsudesk.feature.schedule.data.datasource
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
|
||||
interface ScheduleLocalDataSource {
|
||||
suspend fun save(key: String, schedule: ScheduleEntity)
|
||||
suspend fun load(key: String): ScheduleEntity?
|
||||
suspend fun clear(key: String)
|
||||
suspend fun saveSchedule(key: String, schedule: ScheduleEntity)
|
||||
suspend fun loadSchedule(key: String): ScheduleEntity?
|
||||
suspend fun removeSchedule(key: String)
|
||||
}
|
||||
|
||||
@@ -11,18 +11,18 @@ class ScheduleLocalDataSourceImpl @Inject constructor(
|
||||
private val dao: ScheduleDao
|
||||
) : ScheduleLocalDataSource {
|
||||
|
||||
override suspend fun save(key: String, schedule: ScheduleEntity) {
|
||||
override suspend fun saveSchedule(key: String, schedule: ScheduleEntity) {
|
||||
val (scheduleCache, lessonsCache) = schedule.toCache(key)
|
||||
dao.replaceSchedule(key, scheduleCache, lessonsCache)
|
||||
}
|
||||
|
||||
override suspend fun load(key: String): ScheduleEntity? {
|
||||
override suspend fun loadSchedule(key: String): ScheduleEntity? {
|
||||
val schedule = dao.getSchedule(key) ?: return null
|
||||
val lessons = dao.getLessons(key)
|
||||
return schedule.toDomain(lessons)
|
||||
}
|
||||
|
||||
override suspend fun clear(key: String) {
|
||||
override suspend fun removeSchedule(key: String) {
|
||||
dao.deleteLessonsByKey(key)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,17 @@ package ru.fincode.tsudesk.feature.schedule.data.mapper
|
||||
|
||||
import ru.fincode.tsudesk.core.database.schedule.LessonCacheEntity
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleCacheEntity
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleDbConstants.GROUP_PRE_KEY
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleDbConstants.TEACHER_PRE_KEY
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.LessonEntity
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
|
||||
|
||||
|
||||
|
||||
object ScheduleCacheKey {
|
||||
fun group(number: String) = "group:$number"
|
||||
fun teacher(name: String) = "teacher:$name"
|
||||
fun group(number: String) = "$GROUP_PRE_KEY$number"
|
||||
fun teacher(name: String) = "$TEACHER_PRE_KEY$name"
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user