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来管理文件。

相关推荐
IT学长编程1 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇1 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
陈苏同学1 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm
网络研究院1 小时前
Android 安卓内存安全漏洞数量大幅下降的原因
android·安全·编程·安卓·内存·漏洞·技术
杨哥带你写代码1 小时前
足球青训俱乐部管理:Spring Boot技术驱动
java·spring boot·后端
凉亭下1 小时前
android navigation 用法详细使用
android
郭二哈2 小时前
C++——模板进阶、继承
java·服务器·c++
A尘埃2 小时前
SpringBoot的数据访问
java·spring boot·后端
yang-23072 小时前
端口冲突的解决方案以及SpringBoot自动检测可用端口demo
java·spring boot·后端
沉登c2 小时前
幂等性接口实现
java·rpc