From 1f5dfbc56b231b4bafd70a85e723e9041e6e3941 Mon Sep 17 00:00:00 2001 From: HapeLee <63206378+HapeLee@users.noreply.github.com> Date: Mon, 29 Jun 2026 02:26:29 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=AD=97=E5=85=B8=E9=87=8D=E5=91=BD?= =?UTF-8?q?=E5=90=8D=E9=80=9A=E8=BF=87=E4=BA=8B=E5=8A=A1=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=97=A7=E4=B8=BB=E9=94=AE=E5=B9=B6=E6=8F=92=E5=85=A5=E6=96=B0?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/data/dao/DictRuleDao.kt | 10 ++++++++++ .../legado/app/data/repository/DictRuleRepository.kt | 6 ++++++ .../io/legado/app/ui/dict/rule/DictRuleContract.kt | 6 +++++- .../java/io/legado/app/ui/dict/rule/DictRuleScreen.kt | 8 +++++++- .../io/legado/app/ui/dict/rule/DictRuleViewModel.kt | 6 ++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/DictRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/DictRuleDao.kt index 2802f48e0..1e8488ee9 100644 --- a/app/src/main/java/io/legado/app/data/dao/DictRuleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/DictRuleDao.kt @@ -5,6 +5,7 @@ import androidx.room.Delete import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query +import androidx.room.Transaction import androidx.room.Update import io.legado.app.data.entities.DictRule import kotlinx.coroutines.flow.Flow @@ -45,4 +46,13 @@ interface DictRuleDao { @Query("DELETE FROM dictRules WHERE name IN (:names)") suspend fun deleteByIds(names: Set) + @Query("DELETE FROM dictRules WHERE name = :name") + fun deleteByName(name: String) + + @Transaction + fun replacePrimaryKey(oldName: String, rule: DictRule) { + deleteByName(oldName) + insert(rule) + } + } diff --git a/app/src/main/java/io/legado/app/data/repository/DictRuleRepository.kt b/app/src/main/java/io/legado/app/data/repository/DictRuleRepository.kt index e7b07d9a6..645cb27cb 100644 --- a/app/src/main/java/io/legado/app/data/repository/DictRuleRepository.kt +++ b/app/src/main/java/io/legado/app/data/repository/DictRuleRepository.kt @@ -44,6 +44,12 @@ class DictRuleRepository { } } + suspend fun replacePrimaryKey(oldName: String, rule: DictRule) { + withContext(Dispatchers.IO) { + dao.replacePrimaryKey(oldName, rule) + } + } + suspend fun findById(id: String): DictRule? = withContext(Dispatchers.IO) { dao.getByName(id) } diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleContract.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleContract.kt index 0a215316c..3f35aeb97 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleContract.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleContract.kt @@ -47,7 +47,11 @@ sealed interface DictRuleIntent { data class ExportSelection(val uri: Uri) : DictRuleIntent data class MoveItem(val from: Int, val to: Int) : DictRuleIntent data object SaveSortOrder : DictRuleIntent - data class SaveRule(val rule: DictRule, val isNew: Boolean) : DictRuleIntent + data class SaveRule( + val rule: DictRule, + val isNew: Boolean, + val originalName: String? = null, + ) : DictRuleIntent data class DeleteRule(val rule: DictRule) : DictRuleIntent data class SetRuleEnabled(val rule: DictRule, val enabled: Boolean) : DictRuleIntent data class CopyRule(val rule: DictRule) : DictRuleIntent diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleScreen.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleScreen.kt index 139b954c9..aabc4691b 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleScreen.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleScreen.kt @@ -237,7 +237,13 @@ fun DictRuleScreen( editingRule = null }, onSave = { updatedRule -> - onIntent(DictRuleIntent.SaveRule(updatedRule, isNew = editingRule == null)) + onIntent( + DictRuleIntent.SaveRule( + rule = updatedRule, + isNew = editingRule == null, + originalName = editingRule?.name, + ) + ) showEditSheet = false editingRule = null }, diff --git a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt index 1d4c34a30..356696741 100644 --- a/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/dict/rule/DictRuleViewModel.kt @@ -70,6 +70,10 @@ class DictRuleViewModel( is DictRuleIntent.SaveRule -> { if (intent.isNew) { insert(intent.rule) + } else if (intent.originalName != null && + intent.originalName != intent.rule.name + ) { + replacePrimaryKey(intent.originalName, intent.rule) } else { update(intent.rule) } @@ -188,6 +192,8 @@ class DictRuleViewModel( fun update(vararg rule: DictRule) = viewModelScope.launch { repository.update(*rule) } fun insert(vararg rule: DictRule) = viewModelScope.launch { repository.insert(*rule) } + fun replacePrimaryKey(oldName: String, rule: DictRule) = + viewModelScope.launch { repository.replacePrimaryKey(oldName, rule) } fun delete(vararg dictRule: DictRule) = viewModelScope.launch { repository.delete(*dictRule) } fun copyRule(dictRule: DictRule) {