You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shared Preference与Sqlite Database性能对比:哪个访问速度更快?

关于SharedPreferences vs SQLite的性能对比及迁移建议

嘿,这个问题问到点子上了——咱做Android开发的时候,确实会纠结这种存储方案的性能差异,尤其是在多个页面频繁访问数据的场景下。结合你的情况,我来拆解分析一下:

核心差异:两者的底层逻辑决定了性能表现

  • SharedPreferences:本质是基于XML文件的键值对存储,读操作会一次性把整个文件加载到内存中(小数据量下几乎无感),写操作则支持异步/同步写入XML。它的优势就是轻量、IO开销小,适合存储小体积的简单数据。
  • SQLite:是关系型数据库,每次操作都需要建立数据库连接、执行查询、处理游标,哪怕是简单的getAllData(),也会有数据库初始化、磁盘IO的额外开销。它更适合存储结构化的大量数据,或者需要复杂查询的场景。

针对你的场景:迁移到SharedPreferences肯定能提升性能

你的数据是结构简单的普通JSONObject,而且每个Activity都要重复读取并解析,这时候SQLite的开销就显得没必要了:

  1. 你当前的流程:每个Activity都要实例化DatabaseHandler、执行查询、把查询结果转成JSONObject——这几步里,数据库连接和查询的IO开销是最大的,而且重复实例化Handler也会增加对象创建的成本。
  2. 换成SharedPreferences的流程:只需要把JSONObject转成String存一次,之后每个Activity直接读取这个String再转成JSONObject(甚至可以缓存这个JSONObject的实例,避免重复解析),整个过程的IO开销比SQLite小很多,速度自然更快。

具体实现参考

存储JSONObject到SharedPreferences

// 初始化SharedPreferences
SharedPreferences dataPrefs = getSharedPreferences("AppData", Context.MODE_PRIVATE);
// 将JSONObject转为字符串存储
String jsonStr = yourJsonObject.toString();
dataPrefs.edit().putString("global_data", jsonStr).apply(); // 用apply()异步写入,避免阻塞主线程

读取并解析JSONObject

SharedPreferences dataPrefs = getSharedPreferences("AppData", Context.MODE_PRIVATE);
// 读取字符串,默认值设为空JSON对象
String jsonStr = dataPrefs.getString("global_data", "{}");
try {
    JSONObject jsonObject = new JSONObject(jsonStr);
    String value = jsonObject.optString(key);
    // 后续业务逻辑
} catch (JSONException e) {
    e.printStackTrace();
    // 解析失败的容错处理
}

进一步优化:全局单例缓存

如果你的JSONObject不会频繁变动,可以在Application类里初始化一次,之后所有Activity直接获取这个单例,连IO和JSON解析的开销都省了:

public class MyApp extends Application {
    private static JSONObject globalData;

    @Override
    public void onCreate() {
        super.onCreate();
        // 从SharedPreferences读取并初始化
        SharedPreferences dataPrefs = getSharedPreferences("AppData", MODE_PRIVATE);
        String jsonStr = dataPrefs.getString("global_data", "{}");
        try {
            globalData = new JSONObject(jsonStr);
        } catch (JSONException e) {
            globalData = new JSONObject();
        }
    }

    public static JSONObject getGlobalData() {
        return globalData;
    }

    // 当数据更新时,同步更新单例和SharedPreferences
    public static void updateGlobalData(JSONObject newData) {
        globalData = newData;
        SharedPreferences dataPrefs = getApplication().getSharedPreferences("AppData", MODE_PRIVATE);
        dataPrefs.edit().putString("global_data", newData.toString()).apply();
    }
}

之后在Activity里直接调用MyApp.getGlobalData().optString(key)就行,性能拉满。

注意事项

如果你的JSONObject体积很大(比如超过10KB),那SharedPreferences就不太合适了——因为一次性加载大XML到内存会占用过多内存,反而可能引发OOM或者卡顿。但根据你的描述是“结构简单的普通JsonObject”,这种情况大概率没问题。

内容的提问来源于stack exchange,提问作者dev90

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:37:41