2013-04-17 44 views
2

在我的应用程序中,我有一个在下面的代码中与FileOutputStream一起存储的对象的列表。此外,我的应用程序中存储有SharedPreferences中的任何设置。无论何时我第一次在Google Play商店更新我的应用程序(对于那些不熟悉此流程的用户,我上传了新的APK),所有使用该应用程序的对象都被删除,并且所有设置均被设置为默认值。为什么要这样做?如何将对象存储在更新后不会消失的地方?为什么Android更新我的应用程序擦除信息?

public ObjectStorage readListFromFile() 
{ 
    ObjectStorage temp = null; 
    String filename = "storefileobj"; 
    FileInputStream fis; 
    try { 
     fis = getActivity().openFileInput(filename); 
     ObjectInputStream is = new ObjectInputStream(fis); 
     temp = (ObjectStorage) is.readObject(); 
     is.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (StreamCorruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ClassNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return temp; 
} 


public void updateStorage() 
{ 

    String filename = "storefileobj"; 
    FileOutputStream fos; 
    try { 
     fos = getActivity().openFileOutput(filename, Context.MODE_PRIVATE); 
     ObjectOutputStream os = new ObjectOutputStream(fos); 
     os.writeObject(mainObjectList); 
     os.close(); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

回答

1

对于正常更新,您的用户不会丢失这些值。

我相信你的每个失去存储的SharedPreference和保存的文件数据的用户都被迫删除旧的应用程序,以便从Play商店安装新的应用程序。否则,您的某些密钥或文件格式必须已更改。

签名

你肯定用过Android的Signing Your Applications文档,以便在Play商店更新,但也许有问题的用户使用具有不同的签名(如调试模式下签名)签署了一项应用程序你已经分开交付给他们。这可以解释为什么他们在Play商店更新之前被迫卸载,从而删除了所有保存的信息。

数据格式

另一个替代方案是,也许用于SharedPreferenceKeys改变OR文件格式或类结构的ObjectStorage改变,使得不可能读取的旧值。这对用户来说就好像旧值消失一样。然后,随着用户以新格式保存值,您的应用将继续为他们正常工作。

摘要

以下情况之一必须发生:

  1. 您的用户重新安装之前被删除。或者,
  2. 您存储的数据格式在版本之间更改。
+0

有一件事是我知道的事实,用户不需要重新安装。所以我猜这意味着数据格式必须改变?因为在存储数据时我没有触及代码。 – AggieDev

相关问题