我正在尝试使用共享prefs以不同的方式存储应用程序数据和用户数据,如下所示:
{
"APP_DATA": {
"banners": "{"success":true,"data":{}}",
"gameList": "{"success":true,"data":{}}"
},
"USER_DATA":
{
"emailVerified": "N",
"userName": "97144554455",
"playerToken": "W_8zUx3UCmFPeECjhhjhHhnnsajknHxAM0",
"idVerified": "UPLOADED",
"playerId": "412904",
"bankList": "{"84":"African Bank","5":"FNB : First National Bank"}",
"unreadMsgCount": "0"
}
}
但是每当我更新"0"中的任何值时;APP_ DATA";或";"USER_DATA";,它删除以前的值并更新新的值。示例:在添加";横幅";以及";游戏列表"对于我的APP_DATA;游戏列表"因为它正在覆盖";横幅";价值
MySharedPreferences.instance.setAppStringValue(
"banners", jsonEncode(bannersModel),
);
MySharedPreferences.instance.setAppStringValue(
"gamesList", jsonEncode(gamesListModel),
);
这是我正在使用的功能
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString("APP_DATA", jsonEncode({key: value}));
}
如何解决这个问题?
实际情况是,您正在用一个全新的值(编码为String
(覆盖APP_DATA
键,这将导致先前的数据丢失。
如果你想保持相同的结构,也就是说,有一个APP_DATA
的密钥和另一个USER_DATA
的密钥,它们都有自己的数据,你需要提取以前存储的数据,并将新的数据附加到其中,这样你就可以确保不会丢失它。
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
final String storedData = myPrefs.get('APP_DATA');
final Map newData = {key: value};
try {
// Has previous data, decode it and append into the new one
if (storedData != null) {
newData.addAll(jsonDecode(storedData));
}
} catch (ex) {
print('Couldn't parse the stored data: $ex');
}
myPrefs.setString('APP_DATA', jsonEncode(newData));
}
使用共享首选项时,它使用唯一键来识别相应数据的值。将数据写入键"APP_data"时,它将覆盖整个字符串值。要更改一个值而不覆盖其余值,应将其保存在不同的键中。像这样,
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString("banner", jsonEncode({key: value}));
}
setAppStringValue(String key, String value) async {
SharedPreferences myPrefs = await SharedPreferences.getInstance();
myPrefs.setString("gamesList", jsonEncode({key: value}));
}