KMP(Android-Desktop)项目DataStore Desktop端路径替换及替代库咨询
KMP Desktop端DataStore路径替换及替代方案
一、Desktop端DataStore路径替换方案
Android端通过Context.filesDir获取应用专属文件目录,Desktop端可以使用系统用户目录下的应用专属文件夹作为DataStore的存储路径。以下是具体实现:
在shared/src/desktopMain/kotlin/[包名]/createDataStore.desktop.kt中编写如下代码:
import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.preferencesDataStore import java.io.File private const val dataStoreFileName = "user_preferences.preferences_pb" fun getDataStore(): DataStore<Preferences> = preferencesDataStore( producePath = { // 获取系统用户目录,拼接应用专属文件夹路径 val appDataDir = File(System.getProperty("user.home"), ".your-app-name/datastore") // 确保目录存在 appDataDir.mkdirs() appDataDir.resolve(dataStoreFileName).absolutePath } )
说明:
System.getProperty("user.home")会获取当前用户的主目录(Windows下是C:\Users\[用户名],macOS是/Users/[用户名],Linux是/home/[用户名]).your-app-name替换为你的应用名称,避免和其他应用的文件冲突- 调用
mkdirs()确保目录不存在时自动创建
二、KMP跨平台存储替代库推荐
如果DataStore的跨平台支持不足,以下几个成熟的KMP存储库可以替代:
1. Multiplatform Settings(JetBrains官方推荐)
这是一个轻量级的键值对存储库,类似Android的SharedPreferences,支持所有KMP目标平台。
依赖配置(在shared/build.gradle.kts中):
plugins { kotlin("multiplatform") } kotlin { sourceSets { val commonMain by getting { dependencies { implementation("com.russhwolf:multiplatform-settings:1.1.1") // 如果需要加密存储,添加: // implementation("com.russhwolf:multiplatform-settings-secure:1.1.1") } } } }
使用示例:
// 初始化(commonMain中) import com.russhwolf.settings.Settings val settings = Settings() // 写入数据 settings.putString("username", "john_doe") settings.putInt("user_id", 123) // 读取数据 val username: String? = settings.getStringOrNull("username") val userId: Int = settings.getInt("user_id", defaultValue = 0)
2. SQLDelight(类型安全的SQL存储)
适合需要存储结构化、关系型数据的场景,会根据SQL语句生成类型安全的Kotlin代码,支持多平台。
依赖配置(在shared/build.gradle.kts中):
plugins { kotlin("multiplatform") id("app.cash.sqldelight") version "2.0.1" } sqldelight { databases { create("AppDatabase") { packageName = "com.yourpackage.db" } } } kotlin { sourceSets { val commonMain by getting { dependencies { implementation("app.cash.sqldelight:runtime:2.0.1") } } val androidMain by getting { dependencies { implementation("app.cash.sqldelight:android-driver:2.0.1") } } val desktopMain by getting { dependencies { implementation("app.cash.sqldelight:sqlite-driver:2.0.1") } } } }
使用示例:
- 在
shared/src/commonMain/sqldelight/com/yourpackage/db/AppDatabase.sq中定义表:
CREATE TABLE user ( id INTEGER PRIMARY KEY, username TEXT NOT NULL ); insertUser: INSERT INTO user (id, username) VALUES (?, ?); getUserById: SELECT * FROM user WHERE id = ?;
- 初始化数据库并操作:
// 平台初始化(Android) val driver = AndroidSqliteDriver(AppDatabase.Schema, context, "app.db") val db = AppDatabase(driver) // 平台初始化(Desktop) val driver = JdbcSqliteDriver(JdbcSqliteDriver.IN_MEMORY) // 或指定文件路径:"jdbc:sqlite:/path/to/app.db" AppDatabase.Schema.create(driver) val db = AppDatabase(driver) // 插入数据 db.userQueries.insertUser(1, "john_doe") // 查询数据 val user = db.userQueries.getUserById(1).executeAsOneOrNull()
3. Realm Kotlin(MongoDB出品的NoSQL本地数据库)
适合需要实时同步、复杂数据模型的场景,支持多平台,自带对象映射。
依赖配置(在shared/build.gradle.kts中):
plugins { kotlin("multiplatform") id("io.realm.kotlin") version "1.12.0" } kotlin { sourceSets { val commonMain by getting { dependencies { implementation("io.realm.kotlin:library-base:1.12.0") } } } }
使用示例:
- 定义数据模型:
import io.realm.kotlin.types.RealmObject import io.realm.kotlin.types.annotations.PrimaryKey class User : RealmObject { @PrimaryKey var id: Int = 0 var username: String = "" }
- 初始化数据库并操作:
// 初始化(commonMain中) import io.realm.kotlin.Realm import io.realm.kotlin.RealmConfiguration val config = RealmConfiguration.create(schema = setOf(User::class)) val realm = Realm.open(config) // 写入数据 realm.writeBlocking { copyToRealm(User().apply { id = 1 username = "john_doe" }) } // 查询数据 val user = realm.query(User::class, "id == $0", 1).first().find()
内容的提问来源于stack exchange,提问作者Raka M.A
相关产品推荐
相关产品推荐

