You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")
            }
        }
    }
}

使用示例:

  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 = ?;
  1. 初始化数据库并操作:
// 平台初始化(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")
            }
        }
    }
}

使用示例:

  1. 定义数据模型:
import io.realm.kotlin.types.RealmObject
import io.realm.kotlin.types.annotations.PrimaryKey

class User : RealmObject {
    @PrimaryKey
    var id: Int = 0
    var username: String = ""
}
  1. 初始化数据库并操作:
// 初始化(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:25:25