Android studio存储之SharedPreferences

1.引入依赖

在 Android Studio 中,SharedPreferences 是用来存储基本数据类型如 Stringintboolean 等的键值对的。由于 SharedPreferences 不直接支持存储复杂的数据结构,如 HashMap,你需要将 HashMap 转换为一个可以存储的格式,然后再保存到 SharedPreferences 中。

一种常见的方法是将 HashMap 转换为 JSON 格式的字符串,然后保存这个字符串。当你需要读取 HashMap 时,你可以将这个字符串转换回 HashMap。以下是一个简单的示例:

首先,添加 Gson 依赖到你的 build.gradle 文件中(如果你还没有添加的话):

复制代码
dependencies {  
    implementation 'com.google.code.gson:gson:2.8.9' // 使用合适的版本  
}

1.1注意

  1. 在菜单栏中查找"File",看是否有"Sync Project with Gradle Files"的选项。
  2. 如果在菜单栏中没有找到,你可以尝试在工具栏的空白处右击,选择"Customize Menus and Toolbars..."。
  3. 在弹出的窗口中,你可以在搜索框输入"Sync Project with Gradle Files",然后选中它,再点击"OK"。
  4. 设置完成后,工具栏应该会出现一个类似小象的图标,这就是"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来管理文件。

相关推荐
zh_xuan3 小时前
Android Looper源码阅读
android
坐吃山猪4 小时前
SpringBoot01-配置文件
java·开发语言
我叫汪枫5 小时前
《Java餐厅的待客之道:BIO, NIO, AIO三种服务模式的进化》
java·开发语言·nio
yaoxtao5 小时前
java.nio.file.InvalidPathException异常
java·linux·ubuntu
Swift社区6 小时前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
DKPT7 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy7 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss9 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续9 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升