android compose Json 数据保存

1.添加库

    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
    implementation ("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-core:1.7.3")

2.添加序列化插件配置(很重要,不然不能进行数据存取)

plugins {
    kotlin("plugin.serialization")  version "2.0.0"
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
    alias(libs.plugins.kotlin.compose)
}

3.创建数据类


@Serializable //这句很重要,比较要加上
data class AppSettings(
    @SerialName("id")
    var id: Boolean = true,

    @SerialName("Num")
    var Num: Boolean = true,

    @SerialName("Date1")
    var Date1: Boolean = true,

    @SerialName("ProductName")
    var ProductName: Boolean = true,

    @SerialName("RealNum")
    var RealNum: Boolean = true,

    @SerialName("Price")
    var Price: Boolean = true,

    @SerialName("CustomName")
    var CustomName: Boolean = true,

    @SerialName("ScopeName")
    var ScopeName: Boolean = true,

) {
    companion object {
        fun default() = AppSettings()
    }
}

4.创建功能类

import android.content.Context
import android.util.Log
import data.AppSettings
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.serialization.json.Json
import kotlinx.serialization.encodeToString

import java.io.File
import kotlin.getValue

class SettingsRepository(private val context: Context) {
    private val configFile by lazy {
        File(context.filesDir,  "user_settings.json").apply  {
            if (!exists()) createNewFile()
        }
    }

    private val json = Json {
        prettyPrint = true
        ignoreUnknownKeys = true
        coerceInputValues = true
    }

    suspend fun loadSettings(): AppSettings = withContext(Dispatchers.IO) {
        try {
            configFile.readText().takeIf  { it.isNotBlank()  }?.let {
                json.decodeFromString(it)
            } ?: AppSettings.default()
        } catch (e: Exception) {
            Log.e("Settings", "配置加载失败,使用默认值", e)
            AppSettings.default()
        }
    }

    suspend fun saveSettings(settings: AppSettings): Boolean {
        return withContext(Dispatchers.IO) {
            try {
                // 原子写入模式
                val tempFile = File.createTempFile("config",  ".tmp", context.cacheDir)
                val json= json.encodeToString(settings)
                tempFile.writeText(json)
                tempFile.renameTo(configFile)
                true
            } catch (e: Exception) {
                Log.e("Settings", "配置保存失败", e)
                false
            }
        }
    }
}

5.功能类使用

private val repository: SettingsRepository = SettingsRepository(context)


    fun LoadParamsConfig()
    {
        GlobalScope.launch {
            val settings = repository.loadSettings()
            _AppSettings.update {
                it.copy(
                    id = settings.id,
                    Num = settings.Num,
                    Date1 = settings.Date1,
                    ProductName = settings.ProductName,
                    RealNum = settings.RealNum,
                    Price = settings.Price,
                    CustomName = settings.CustomName,
                    ScopeName = settings.ScopeName
                    )
            }
        }
    }

    fun SaveParamsToConfig(){
        GlobalScope.launch {
            var appSettings1 = AppSettings()
            appSettings1.let {
                it.id = appSettings.value.id
                it.Date1 = appSettings.value.Date1
                it.Num = appSettings.value.Num
                it.RealNum = appSettings.value.RealNum
                it.Price = appSettings.value.Price
                it.ScopeName = appSettings.value.ScopeName
                it.ProductName = appSettings.value.ProductName
                it.CustomName = appSettings.value.CustomName
            }
            repository.saveSettings(appSettings1)
            Log.i("scoreInfo",appSettings1.toString())
        }

    }

上面代码可以入在一个ViewModel类中进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lph009

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值