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