2015-04-07 58 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實例。