2015-11-12 103 views
0

我的Android應用程序有一個相當複雜的對象數組,我用它來存儲用戶數據,我想在運行應用程序時保存該數組並從以前的會話中恢復數據。所討論的對象具有多個數據段(因此將對象放在第一位),所以我真的不想將所有組件寫出到SharedPreferences中(這是我的一個想法)。我還研究了onSaveInstanceState(),它似乎沒有足夠的可靠性來幫助我。保留Android活動數據

有問題的對象是Serializable,但它沒有出現可以使用的putSerializable()方法,所以我看不到這對我如何幫助解決此問題。

任何人都可以提供一個建議,將這個數據轉儲到非易失性的地方,然後重新使用嗎?

+0

對於使用onSaveInstanceState(),您應該可以創建一個包裝類,該類包含Serializable對象的數組。類似於這個答案:http://stackoverflow.com/a/31422024/4409409 –

+0

從以前的會話?使用數據庫。 – JacksOnF1re

回答

1

如果您剛剛設置爲使用Serializable進行滾動,您可以考慮使用普通Java-land中用於編寫可序列化到String的相同類型的方法以存儲在SharedPreference中;一種方法見this question

否則,我認爲你最好使用GSON之類的東西,比如Zanna提供的建議。

+0

事實證明,將一個可序列化的對象(更具體地說是一個可序列化對象的ArrayList)轉換爲一個字符串非常簡單,但我仍然有點驚訝於代碼是如此複雜。無論如何,你的例子是非常有用的,特別是因爲我仍然沒有意識到如何將Gson放到我的Android項目中。 – Rich

+0

是的,OOB Android持久性故事非常手動。但是GSON並沒有那麼可怕 - 如果你有暴露的屬性或getter/setter加上無參數構造函數,你可以基本上調用'GSON.toJson(myInstance)'和'GSON.fromJson(someJsonString,MyClass.class)'來你需要什麼。調試的好處將會容易得多,因爲你所持有的數據是正常的人類可讀的JSON,並且從一個模型版本升級到另一個(例如,當你仍然存儲了一個新的字段到模型時從DB中舊的表示複製)不太可能打破宇宙。 –

1

使用SharedPreferences對於除了相當簡單的鍵值對之外的任何東西都是不理想的。你最好的選擇是使用SQLite數據庫。檢查developer docs瞭解更多信息。

+0

我的應用程序已經有了一個數據庫,所以至少該步驟已經完成了,但是我仍然必須一一寫出我的對象中的所有基元,不是嗎? – Rich

0

您可以使用您的應用程序的內部存儲來保存這些數據,並在您每次需要通過FileInputStream進行恢復。

如果您的對象比較複雜,爲了節省空間,您可以使用Gson對其進行序列化,然後將其保存爲簡單字符串,並始終保存在內部存儲器中。

例子:

Object yourObject = new Object; 
Gson gson = new Gson(); 
String serializedObject = gson.toJson(yourObject); 

//write to internal storage 
FileOutputStream fos = openFileOutput(filename, Context.MODE_PRIVATE); 
fos.write(string.getBytes()); 
fos.close(); 

你可以閱讀該字符串以這樣的方式

String filename = "your_file"; 
FileInputStream fis = openFileInput(filename); 
StringBuffer sBuffer = new StringBuffer(); 
DataInputStream dataIO = new DataInputStream(fis); 
String strLine = null; 
while((strLine = dataIO.readLine()) != null) 
{ 
sBuffer.append(strLine+」\n」); 
} 
dataIO.close(); 
fis.close(); 

,最後反序列化。