Android 无法在共享首选项中存储字符串(巨大)

Android 无法在共享首选项中存储字符串(巨大),android,sharedpreferences,Android,Sharedpreferences,Iam通过在共享首选项中使用GSON将复杂对象转换为json来存储它。但是在检索时,无法获取所需的字符串 代码 这里holderListCustomizationMap是对象的复杂映射 设置共享首选项: Gson gson = builder.create(); SharedPreferences sh=getSharedPreferences("MYFILE",Context.MODE_PRIVATE); SharedPreferences.Editor edi

Iam通过在共享首选项中使用GSON将复杂对象转换为json来存储它。但是在检索时,无法获取所需的字符串

代码

这里holderListCustomizationMap是对象的复杂映射

设置共享首选项:

Gson gson = builder.create();
        SharedPreferences sh=getSharedPreferences("MYFILE",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sh.edit();
        String json = gson.toJson(holderListCustomizationMap);
        editor.putString("Holder",json);
        editor.apply();
SharedPreferences sh = context.getSharedPreferences("MYFILE", Context.MODE_PRIVATE);
    String listCutomizatoinJson = sh.getString("Holder","");
在存储时,json输出为整个预期字符串

从共享首选项检索我的地图:

Gson gson = builder.create();
        SharedPreferences sh=getSharedPreferences("MYFILE",Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sh.edit();
        String json = gson.toJson(holderListCustomizationMap);
        editor.putString("Holder",json);
        editor.apply();
SharedPreferences sh = context.getSharedPreferences("MYFILE", Context.MODE_PRIVATE);
    String listCutomizatoinJson = sh.getString("Holder","");

当我打印listCutomizatoinJson时,得到的不仅仅是整个json。

创建一个sqLite数据库。 共享首选项有大小限制。 通常,它用于在处理以下内容时存储数据:

  • 小数据(可能是游戏分数、用户名等)

  • 在键值对中

  • 共享首选项已被删除

    SharedReferences文件中值的最大大小限制为您试图存储的值的最大大小。(这意味着您不能输入比Java中字符串长度更长的字符串值。)

    确保您试图存储正确的值。可能您在json解析方面有问题,但在共享首选项方面没有问题。

    快速浏览之后,我发现共享首选项似乎没有限制

    看起来您的字符串加载不正确。 您需要从下面使用GSON方法。应该是这样的

    GsonBuilder gsonb = new GsonBuilder();
    Gson mGson = gsonb.create();
    String listCutomizatoinJson = sh.getString("Holder", "");
    String yourFile = mGson.fromJson(loadValue, String);
    
    当您刚从SharedReferences获取字符串时,仍然需要将其转换回原始对象

    此外,当您存储您的值时,请尝试使用

    editor.commit();
    

    而不是
    .apply()

    将一个大的
    字符串
    存储到
    共享引用
    是一个长时间的异步操作。检查您的问题是否不是您只是试图在保存之前读取该值。还要检查两个操作是否使用相同的
    SharedReferences
    实例。

    如果数据太大,则可以尝试将数据保存到数据库。使用
    或mlite
    可以轻松快速地保存数据
    SharedReferences
    不是存储大对象的地方,而是存储小值和键值的地方。共享首选项的大小限制是什么。json解析没有问题,因为解析后打印json字符串时,它会按预期显示。是的,我知道,但包含我的json本身的listCutomizatoinJson字符串变为空白。因此无法重新创建我的对象。@请查看我的编辑。它可能是
    .apply()
    ,我不确定,因为我总是使用
    .commit()
    当它成功时.commit()会给你一个true。
    commit
    apply
    之间没有太大区别,只是
    commit
    会返回操作是否成功。是的,我只是自己搜索了它。但是看起来他的对象根本没有被存储,所以使用
    commit
    我们至少可以确定在存储值时没有出错