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