1.引入依赖
在 Android Studio 中,SharedPreferences
是用来存储基本数据类型如 String
、int
、boolean
等的键值对的。由于 SharedPreferences
不直接支持存储复杂的数据结构,如 HashMap
,你需要将 HashMap
转换为一个可以存储的格式,然后再保存到 SharedPreferences
中。
一种常见的方法是将 HashMap
转换为 JSON
格式的字符串,然后保存这个字符串。当你需要读取 HashMap
时,你可以将这个字符串转换回 HashMap
。以下是一个简单的示例:
首先,添加 Gson 依赖到你的 build.gradle
文件中(如果你还没有添加的话):
dependencies {
implementation 'com.google.code.gson:gson:2.8.9' // 使用合适的版本
}
1.1注意
- 在菜单栏中查找"File",看是否有"Sync Project with Gradle Files"的选项。
- 如果在菜单栏中没有找到,你可以尝试在工具栏的空白处右击,选择"Customize Menus and Toolbars..."。
- 在弹出的窗口中,你可以在搜索框输入"Sync Project with Gradle Files",然后选中它,再点击"OK"。
- 设置完成后,工具栏应该会出现一个类似小象的图标,这就是"Sync Project with Gradle Files"的按钮。
2.模板类的声明
需创建一个文件java类名为SharedPreferencesHelper,可以使用以下代码来保存和读取 HashMap
:
import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
public class SharedPreferencesHelper {
private static final String PREFS_NAME = "MyPrefsFile";
private static final String HASHMAP_KEY = "hashmap_key";
private static SharedPreferences sharedPreferences;
private static Gson gson;
public static void init(Context context) {
sharedPreferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
gson = new Gson();
}
public static void saveHashMap(Context context, String key, HashMap<String, String> hashMap) {
String json = gson.toJson(hashMap);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, json);
editor.apply();
}
public static HashMap<String, String> loadHashMap(Context context, String key) {
String json = sharedPreferences.getString(key, null);
if (json == null) {
return null;
}
Type type = new TypeToken<HashMap<String, String>>(){}.getType();
return gson.fromJson(json, type);
}
}
3.使用例程
可以这样读取 HashMap
:
//1.加载
SharedPreferencesHelper.init(this);
HashMap<String, String> loadedHashMap = SharedPreferencesHelper.loadHashMap(this, SharedPreferencesHelper.HASHMAP_KEY);
if (loadedHashMap != null) {
// 使用 loadedHashMap 做些什么...
}
//2.存储
HashMap<String, String> myHashMap = new HashMap<>();
myHashMap.put("key1", "value1");
myHashMap.put("key2", "value2");
// 假设你已经有了 Context 对象,比如在一个 Activity 中
SharedPreferencesHelper.saveHashMap(this, SharedPreferencesHelper.HASHMAP_KEY, myHashMap);
注意,上面的代码假设你的 HashMap
的键和值都是 String
类型的。如果你的 HashMap
包含其他类型的键或值,你需要相应地调整 Gson 的转换逻辑。此外,当处理复杂的数据结构时,请确保正确地处理任何可能的 null
值和异常。
4.个人经验
4.1 SharedPreferences赋值覆盖
在 Android 中,使用 SharedPreferences
来存储键值对时,如果你再次调用 putString
方法并使用相同的键(key)来存储一个新的值(value),那么原有的值会被新的值所覆盖。
换句话说,SharedPreferences
的行为类似于一个映射(Map)或字典(Dictionary),其中键是唯一的,每个键都对应一个值。当你用相同的键存储一个新的值时,原有的值就会被替换掉。
SharedPreferences sharedPreferences = getSharedPreferences("my_prefs", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
// 第一次存储键值对
editor.putString("my_key", "first_value");
editor.apply();
// ... 一些其他的代码或时间流逝 ...
// 第二次使用相同的键存储新的值
editor.putString("my_key", "second_value");
editor.apply();
在上面的代码中,我们首先使用键 "my_key" 存储了一个值 "first_value"。然后,在稍后的某个时刻,我们使用相同的键 "my_key"存储了一个新的值 "second_value"。此时,原有的值"first_value"就会被新的值 "second_value"所覆盖。
因此,当你再次从 SharedPreferences
中读取键 "my_key"
对应的值时,你会得到 "second_value"
而不是 "first_value"
。
4.2 saveHashMap调用程序崩溃
首先,你需要在应用的AndroidManifest.xml
文件中声明对外部存储的访问权限。对于Android 6.0(API级别23)及更高版本,你还需要在运行时请求这些权限。
对于基本的文件读写权限,你可以添加如下声明:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
请注意,从Android 10(API级别29)开始,WRITE_EXTERNAL_STORAGE
权限对大多数应用而言已经不再适用,并且被分区存储和媒体存储API所取代。如果你的应用目标是Android 10或更高版本,你应该考虑使用这些新的API来管理文件。