From 60927892c4c8393eff760717ad90a83833120d42 Mon Sep 17 00:00:00 2001 From: Super12138 <70494801+Super12138@users.noreply.github.com> Date: Sat, 22 Mar 2025 08:15:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(settings):=20#180=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=87=E4=BB=BD=E5=85=A8=E9=83=A8=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle.kts | 2 +- .../todo/ui/pages/settings/SettingsData.kt | 4 +-- .../todo/ui/viewmodels/MainViewModel.kt | 29 ++++++++++++++----- app/src/main/res/values-zh-rCN/strings.xml | 4 +-- app/src/main/res/values/strings.xml | 4 +-- 5 files changed, 28 insertions(+), 15 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6fc78f3..37e6092 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -34,7 +34,7 @@ android { applicationId = "cn.super12138.todo" minSdk = 24 targetSdk = 36 - versionCode = 603 + versionCode = 605 versionName = "2.1.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/pages/settings/SettingsData.kt b/app/src/main/kotlin/cn/super12138/todo/ui/pages/settings/SettingsData.kt index f9cbf05..a3aa60b 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/pages/settings/SettingsData.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/pages/settings/SettingsData.kt @@ -57,7 +57,7 @@ fun SettingsData( contract = ActivityResultContracts.CreateDocument("application/zip"), onResult = { if (it != null) { - viewModel.backupDatabase( + viewModel.backupAppData( uri = it, context = context, onResult = { success -> @@ -84,7 +84,7 @@ fun SettingsData( contract = ActivityResultContracts.OpenDocument(), onResult = { if (it != null) { - viewModel.restoreDatabase( + viewModel.restoreAppData( uri = it, context = context, onResult = { success -> diff --git a/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt b/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt index ae9a516..8d6b9d2 100644 --- a/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt +++ b/app/src/main/kotlin/cn/super12138/todo/ui/viewmodels/MainViewModel.kt @@ -177,19 +177,21 @@ class MainViewModel : ViewModel() { appSecureMode = enabled } - fun backupDatabase(uri: Uri, context: Context, onResult: (completed: Boolean) -> Unit) { + fun backupAppData(uri: Uri, context: Context, onResult: (completed: Boolean) -> Unit) { viewModelScope.launch(Dispatchers.IO) { try { // 获取数据库文件路径 val dbPath = TodoApp.db.openHelper.writableDatabase.path + val prefPath = "${context.filesDir.parent}/shared_prefs" // 开启输出文件流,输出位置为用户选取的文件夹URI context.contentResolver.openOutputStream(uri)?.use { outputStream -> ZipOutputStream(BufferedOutputStream(outputStream)).use { zipOutStream -> listOf( - context.getDatabasePath(Constants.DB_NAME), - File("$dbPath-wal"), - File("$dbPath-shm") - ).forEach { file -> + context.getDatabasePath(Constants.DB_NAME), // 数据库 + File("$dbPath-wal"), // 数据库-wal + File("$dbPath-shm"), // 数据库-shm + File("$prefPath/${Constants.SP_NAME}.xml") // SharedPreferences + ).filter { it.exists() }.forEach { file -> FileUtils.addFileToZip(file, file.name, zipOutStream) } } @@ -204,19 +206,30 @@ class MainViewModel : ViewModel() { } } - fun restoreDatabase(uri: Uri, context: Context, onResult: (completed: Boolean) -> Unit) { + fun restoreAppData(uri: Uri, context: Context, onResult: (completed: Boolean) -> Unit) { viewModelScope.launch(Dispatchers.IO) { try { // 获取数据库文件夹 - val outputPath = context.getDatabasePath(Constants.DB_NAME).parent + val dbPath = context.getDatabasePath(Constants.DB_NAME).parent + val prefPath = "${context.filesDir.parent}/shared_prefs/" + // 开启输入文件流,输入位置为用户选取的文件URI context.contentResolver.openInputStream(uri)?.use { inputStream -> ZipInputStream(BufferedInputStream(inputStream)).use { zipInputStream -> generateSequence { zipInputStream.nextEntry }.forEach { zipEntry -> - val outputFile = File(outputPath, zipEntry.name) + // 判断是否为 SharedPreferences 设置文件 + val outputFile = if (zipEntry.name.endsWith(".xml")) { + File(prefPath, zipEntry.name) + } else { + File(dbPath, zipEntry.name) + } + // 输出文件 if (zipEntry.isDirectory) { + // 如果是文件夹则创建文件夹 outputFile.mkdirs() } else { + // 父文件夹为空就创建父文件夹 outputFile.parentFile?.mkdirs() + // 输出文件 FileOutputStream(outputFile).use { zipInputStream.copyTo(it) } } zipInputStream.closeEntry() diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 029d959..87b18e4 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -97,9 +97,9 @@ 数据 备份与恢复、管理数据 备份数据 - 将待办数据库保存在你的设备上 + 将待办的应用数据保存在你的设备上 恢复数据 - 从你的设备上恢复待办数据库 + 从你的设备上恢复待办的应用数据 备份成功 备份失败 数据恢复成功,需要重启应用以加载数据 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index db35b6d..9e2854f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -98,9 +98,9 @@ Data Backup and Restore, Manage Data Backup - Save the to-do database on your device + Save the To Do app data on your device Restore - Restore the to-do database from your device + Restore the To Do app data from your device Backup successful Backup failed Restore successful, restart the app to load data