2015-11-12 68 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(); 

,最后反序列化。