如何使用 SharedPreferences 保存和检索自定义对象列表?
How to save and retrieve a list of custom objects with SharedPreferences?
我正在制作一个用于燃料费用跟踪的 Flutter 应用程序。我有一个简单的对象:
class Entry {
double _fuel;
double _money;
double _distance;
Entry(this._fuel, this._money, this.distance);
Entry.fromJson(Map<String, dynamic> json) => Entry (json['fuel'], json['money'], json['distance']);
Map<String, dynamic> toJson() => {'fuel':_fuel, 'money':_money, 'distance':_distance};
}
每当我重新装满我的坦克时,我都想创建一个新条目并几乎永远保留所有这些条目。在应用程序中,我有一个 List<Entry> entries
,但我找不到将该列表保存在 SharedPreferences
中的方法。只有一种方法接受字符串列表。我应该通过迭代我的 List<Entries>
并序列化每个条目来创建一个新的 List<String>
,然后将该列表保存到 SharedPreferences
还是有更简单的方法?当我想阅读 SharedPreferences
时,如何重新创建我的列表?
更新:当然,我还需要能够从列表中删除特定条目。
谢谢。
- 将它们保存为
List<String>
确实是一个可行的选择,我能想到的另一个选择是使用 json.encode()
方法将整个列表序列化为 json 并将其保存为SharedPreferences 中的一个字符串,然后检索并反序列化它们并迭代它们以再次将它们变成您的自定义对象。
SharedPreferences prefs = await SharedPreferences.getInstance();
List<Entry> entries = // insert your objects here ;
final String entriesJson = json.encode(entries.map((entry) => entry.toJson()).toList());
prefs.setString('entries', entriesJson);
final String savedEntriesJson = prefs.getString('entries);
final List<dynamic> entriesDeserialized = json.decode(savedEntriesJson);
List<Entry> deserializedEntries = entriesDeserialized.map((json) => Entry.fromJson(json)).toList();
要从 SharedPreferences 中删除特定键(及其值),只需使用 remove(key)
方法,或者如果您要使用相同的键,您可以使用新值,它将覆盖以前的值。
要从您的 List<Entry>
中删除特定项目,您可以使用 List class
的 remove(entry)
方法(如果您可以传递该项目),或者删除项目取决于特定条件使用 removeWhere((entry) => entry.distance > 500)
例如。
希望对您有所帮助。
要添加 entry
,您不需要序列化所有条目,只需使用 SharedPreferences
的 getStringList
并将 entry
的 json string
添加到字符串列出并再次保存
var sharedPreferences = await SharedPreferences.getInstance();
List<String> entriesStr = sharedPreferences.getStringList(KEY);
entriesStr.add(jsonEncode(entryToAdd.toJson()));
sharedPreferences.setStringList(KEY, entriesStr);
我正在制作一个用于燃料费用跟踪的 Flutter 应用程序。我有一个简单的对象:
class Entry {
double _fuel;
double _money;
double _distance;
Entry(this._fuel, this._money, this.distance);
Entry.fromJson(Map<String, dynamic> json) => Entry (json['fuel'], json['money'], json['distance']);
Map<String, dynamic> toJson() => {'fuel':_fuel, 'money':_money, 'distance':_distance};
}
每当我重新装满我的坦克时,我都想创建一个新条目并几乎永远保留所有这些条目。在应用程序中,我有一个 List<Entry> entries
,但我找不到将该列表保存在 SharedPreferences
中的方法。只有一种方法接受字符串列表。我应该通过迭代我的 List<Entries>
并序列化每个条目来创建一个新的 List<String>
,然后将该列表保存到 SharedPreferences
还是有更简单的方法?当我想阅读 SharedPreferences
时,如何重新创建我的列表?
更新:当然,我还需要能够从列表中删除特定条目。
谢谢。
- 将它们保存为
List<String>
确实是一个可行的选择,我能想到的另一个选择是使用json.encode()
方法将整个列表序列化为 json 并将其保存为SharedPreferences 中的一个字符串,然后检索并反序列化它们并迭代它们以再次将它们变成您的自定义对象。
SharedPreferences prefs = await SharedPreferences.getInstance();
List<Entry> entries = // insert your objects here ;
final String entriesJson = json.encode(entries.map((entry) => entry.toJson()).toList());
prefs.setString('entries', entriesJson);
final String savedEntriesJson = prefs.getString('entries);
final List<dynamic> entriesDeserialized = json.decode(savedEntriesJson);
List<Entry> deserializedEntries = entriesDeserialized.map((json) => Entry.fromJson(json)).toList();
要从 SharedPreferences 中删除特定键(及其值),只需使用
remove(key)
方法,或者如果您要使用相同的键,您可以使用新值,它将覆盖以前的值。要从您的
List<Entry>
中删除特定项目,您可以使用List class
的remove(entry)
方法(如果您可以传递该项目),或者删除项目取决于特定条件使用removeWhere((entry) => entry.distance > 500)
例如。
希望对您有所帮助。
要添加 entry
,您不需要序列化所有条目,只需使用 SharedPreferences
的 getStringList
并将 entry
的 json string
添加到字符串列出并再次保存
var sharedPreferences = await SharedPreferences.getInstance();
List<String> entriesStr = sharedPreferences.getStringList(KEY);
entriesStr.add(jsonEncode(entryToAdd.toJson()));
sharedPreferences.setStringList(KEY, entriesStr);