Android:将地图保存到 SharedPreferences?

Sla*_*ion 3 java android dictionary sharedpreferences kotlin

我需要以SharedPreferences这样的方式将数据保存到我有这样一个对象的地方:

{
    "days": [
        {
            "exercises": [
                {
                    "name": "Bench Press",
                    "sets": 3,
                    "reps": 8
                },
                {
                    "name": "Skull Crushers",
                    "sets": 3,
                    "reps": 8
                },
                {
                    "name": "Flys",
                    "sets": 3,
                    "reps": 8
                }
            ]
        },
        {
            "exercises": [
                {
                    "name": "Bench Press",
                    "sets": 3,
                    "reps": 8
                },
                {
                    "name": "Skull Crushers",
                    "sets": 3,
                    "reps": 8
                },
                {
                    "name": "Flys",
                    "sets": 3,
                    "reps": 8
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我需要从对象中拉出并添加到对象中。我知道你不能将地图保存到SharedPreferences. 我开始认为我最好的选择是使用,ObjectOutputStream但我不确定这是否是使用内部存储器的最佳选择。我想我只是在寻找有关我最好的选择的指导。

编辑:从Advice-Dog所说的来看,我认为我最好的选择是使用gson. 这是否意味着当我想(例如)将另一个练习添加到“天”的第二个索引时,我将首先从首选项中获取对象,将其转换gson为对象,然后添加练习,然后将其转换回来对gson,然后覆盖的偏好?我并不是说这不好,我只是想知道这是否应该做以及是否可取。

Adv*_*Dog 7

在 Android 中保存更复杂的类型时,我建议使用gson. Gson 是 Google 的 JSON 解析库,即使您不使用 JSON,也可以将其转换Objects为 JSON 字符串并轻松存储。

例如,您可以将您的列表Objects转换为String这样的。

val list : List<MyObject>  // ... add items to your list

// Convert to JSON

val string = gson.toJson(list)

// Store it into Shared Preferences
preferences.putString("list", string).apply()
Run Code Online (Sandbox Code Playgroud)

然后你可以很容易地把它放回这样的列表中。

// Fetch the JSON 

val string = preferences.getString("list", "")

// Convert it back into a List

val list: List<MyObject> = gson.fromJson(string, object : TypeToken<List<MyObject>>() {}.type)
Run Code Online (Sandbox Code Playgroud)