2016-08-22 9 views
0

Google Playストアにアプリケーションがあります。このアプリケーションでは、いくつかのデータをファイルに保存します(データベースはより良いが、もっと多くの作業を意味する)。これは完全に機能しますが、例えばバージョン2を実行しているときにファイルにデータを保存すると、そのファイルを元に戻すことができます。しかし、バージョン3に更新すると、データはロードされませんが、ファイルはアプリケーションの「ファイル」ディレクトリに残ります。このファイルは、デバイスの内部ストレージに保存されます。これがなぜ起こるのか分かりませんが、別のsharedUserIdが原因である可能性があることをインターネットで読み取っていますが、私のマニフェストにsharedUserIdはありません。私はAndroidがそれを生成することを知っていますが、これは常に同じですか?アプリが別のコンピュータでコンパイルされていても? 誰かを助けることができますか?更新後にAndroid内蔵ストレージのファイルが読み取れない

ありがとうございます!

EDIT

私は、ファイルの読み書きに使用するいくつかのコード:

は、書き込むには:

try { 
      FileOutputStream fos = context.openFileOutput(fileName, Context.MODE_PRIVATE); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 
      os.writeObject(object); 
      os.close(); 

     } catch (IOException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } finally { 

     } 

を読むには:

try { 
      FileInputStream fis = context.openFileInput(fileName); 
      ObjectInputStream is; 
      is = new ObjectInputStream(fis); 
      Serializable objectOut = (Serializable) is.readObject(); 
      is.close(); 
      return objectOut; 
     } catch (StreamCorruptedException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } catch (IOException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } catch (ClassNotFoundException e) { 
      LogUtils.e(IoUtils.class.getSimpleName(), e.getMessage()); 
     } 
     return null; 

を更新した後何もそのファイルから抜け出すようですが、私は何も取得していませんエラーです。 ROOTファイルエクスプローラを使用すると、/ data/data/myApp/files /に移動し、更新前と同じサイズのファイルを見つけることができます。

+0

「Androidが生成することはわかっていますが、これは常に同じですか?」 - はい、特定のデバイスの場合。 「アプリが別のコンピュータでコンパイルされていても」 - はい、これは問題ではありません。 Androidは開発ツールではなくユーザーIDを作成するものです。これはどのようなデバイスのモデルとモデルですか? – CommonsWare

+0

2台のデバイスでテストしたところ、どちらも問題あり – Allinone51

+0

OK ...どのようなモデルとモデルがありますか? – CommonsWare

答えて

1

カスタム化されていないシリアライズ可能なオブジェクトは、アプリケーションバージョン間でオブジェクトの形式が変更される可能性があるため、長期間の保存には使用しないでください。私はあなたが新しいバージョン(またはライブラリオブジェクトが変更された)のオブジェクトに1つの変数を追加したと仮定して、あなたのSerializableは壊れています。
は何をすべきことは、古いデータを取得するには、上書き機能

private void writeObject(java.io.ObjectOutputStream out) throws IOException` 

private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException; 

private void readObjectNoData() throws ObjectStreamException; 

することにより、カスタムのシリアル化を使用して、正確に古いフォーマットを読むためにシリアライズを変更です。また、シリアライゼーションにいくつかのバージョン識別子を入れて、正しく読むことができるようにする必要があります。
これは非常に乱雑ですが、通常はjson(またはXML)に保存する方がはるかに優れています。

+0

私はそれをチェックします!ありがとう – Allinone51

+0

2つのアップデートの間でパッケージ名が変更されました。 – Allinone51

+0

パーセル可能なオブジェクトをファイルに保存することはできますか? – Allinone51

関連する問題