从xml中读取对象列表并保存在共享首选项中

时间:2017-08-19 12:43:58

标签: android json xml object sharedpreferences

我有一个列表视图中显示的对象列表。另外,我有一个最喜欢的列表,用于将所选对象保存到共享首选项中。

当项目被标记为收藏时,我创建了一个方法,将在外部存储中创建该xml文件的备份。

这是它的工作原理:

    private void backupFav(){
    String myPath = Environment.getExternalStorageDirectory().toString() +"/backup/";
    try{
        File myFile = new File(myPath, PREFS_NAME+".xml");
        FileWriter fw = new FileWriter(myFile);
        PrintWriter pw = new PrintWriter(fw);

        Map<String,?> prefsMap = settings.getAll();

        for(Map.Entry<String,?> entry : prefsMap.entrySet())
        {
            pw.println(entry.getKey() + ": " + entry.getValue().toString());
        }
        pw.close();
        fw.close();
    }
    catch (Exception e){
        // what a terrible failure...
        Log.wtf(getClass().getName(), e.toString());
    }
}

当项目被标记为收藏时,它将被调用:

    private void saveFavorites(List<ProductLocal> favorites) {
    String jsonFavorites = gson.toJson(favorites);
    editor.putString(FAVORITES, jsonFavorites);
    editor.apply();
    backupFav();
}

到目前为止一切正常。

(有数百个项目,我在用户意外卸载我的应用程序时执行此操作,而不是丢失所有这些数据,所以我会在每次首次启动时检查并恢复备份数据)。

现在我的问题是从备份文件中读取数据。

    public boolean restoreFav(Context context) {
    boolean restored = false;
    File src = new File(path2+PREFS_NAME+".xml");
    ObjectInputStream input = null;
    try {
        input = new ObjectInputStream(new FileInputStream(src));
        SharedPreferences.Editor prefEdit = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE).edit();
        prefEdit.clear();
        Map<String, ?> entries = (Map<String, ?>) input.readObject();
        for (Map.Entry<String, ?> entry : entries.entrySet()) {
            Object v = entry.getValue();
            String key = entry.getKey();
            prefEdit.putString(key, ((String) v));
        }
        prefEdit.apply();
        restored = true;
    } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (input != null) {
                input.close();
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return restored;
}

它不起作用。没有结果,没有输出。

请帮忙吗?

修改

经过调试后,我发现我得到了StreamCorruptedException

08-20 18:42:44.228: W/System.err(28802): java.io.StreamCorruptedException
08-20 18:42:44.238: W/System.err(28802):    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2115)
08-20 18:42:44.238: W/System.err(28802):    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:372)

0 个答案:

没有答案