2015-04-07 139 views
1

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(); 

虽然存储,JSON打印出是整个期望的字符串。

检索我的地图从共享偏好:

SharedPreferences sh = context.getSharedPreferences("MYFILE", Context.MODE_PRIVATE); 
    String listCutomizatoinJson = sh.getString("Holder",""); 

当我打印listCutomizatoinJson,得到这个{}只不是整个JSON。

+0

如果数据太大,您可以尝试将数据保存到数据库。 – Amsheer

+1

使用'OrmLite'可以轻松快速地保存。 'SharedPreferences'不是存储大对象的地方,而是小而关键的值。 – Shnkc

回答

0

创建一个sqLite数据库。 共享偏好具有大小限制。 通常将其与处理时用来存储数据:

  1. 小数据(可能得分的游戏,用户名等)

  2. 在关键值对

+0

什么是共享首选项的大小限制。 – Yatin

0

共享偏好设置有no limitations

SharedPreferences文件中的最大值限制为您尝试存储的最大值。 (这意味着您不能放置比String更长的字符串值,可以使用Java。)

确保您尝试存储正确的值。可能你有json解析的问题,但不能用共享首选项。

+0

json解析没有问题,因为在解析后打印json字符串时,它按预期显示。 – Yatin

0

经过快速的search我发现似乎没有共享首选项的限制。

它看起来像你正在加载你的字符串加载不正确。 您需要从中使用GSON方法。它应该看起来像这样。

GsonBuilder gsonb = new GsonBuilder(); 
Gson mGson = gsonb.create(); 
String listCutomizatoinJson = sh.getString("Holder", ""); 
String yourFile = mGson.fromJson(loadValue, String); 

当你刚刚获得您的sharedpreferences字符串中,你仍然需要在你存储你的价值尝试使用的.apply()

editor.commit(); 

,而不是将其转换回原来的对象

+0

是的,我知道,但包含我的JSON本身的listCutomizatoinJson字符串已经空白。因此无法重新创建我的对象。 – Yatin

+0

@Yatin看看我的编辑。它可能是'.apply()',我不确定是否因为我总是使用'.commit()',当它成功时,.commit()会给你一个真实的结果 – NoSixties

+0

' commit'和'apply',只有'commit'返回动作是否成功。 – Lamorak

1

将较大的String存储为SharedPreferences是一个很长的异步操作。检查你的问题是不是你只是试图在保存之前读取它的值。同时检查两个操作是否使用相同的SharedPreferences实例。