2011-08-07 10 views
0

環境設定がどこにも格納されていないことを安全にアサートする方法を見つけようとしました。それはまだキャッシュ機構を理解していないと思われ、ドキュメントはそれを明確にしていない。これは私がやったことです:共有環境設定が存在しないことを安全にアサートする方法

File prefsFile = new File("/data/data/"+context.getPackageName() + "/shared_prefs/" 
    + context.getPackageName() + "_preferences.xml"); 
prefsFile.delete(); 
assertFalse(prefsFile.exists()); // success 

// This assertion could fail - why? 
assertEquals(0, context.getSharedPreferences(context.getPackageName()+"_preferences", 
    MODE_PRIVATE).getAll().size()); 

私は環境設定ファイルを削除しますが、getAll().size()がゼロ以外の値を返すことも可能です。

誰かが理由を説明できますか?

答えて

2

私は、どのようにして安全性を保証しようとしているのかを見出そうとしましたが、その嗜好はどこにも保存されていません。

なぜですか?

誰かが理由を説明できますか?私の頭の上オフ

  • あなたが実際にファイルがそれを削除する前に存在しているかどうかを確認するためにテストされていない、またはディレクトリが
  • が存在する場合は、そのパスをハードコーディングされていますあなたは、ファイルを削除するとSharedPreferences
  • のインプロセスのコピーを削除しますが、で返さHashMapを見てわざわざされていないと仮定されているすべてのデバイス
  • に正しくない可能性がありますgetAll()あなたのデータがあるかどうかを確認するために、またはそれはいくつかのシステムが提供する初期値

ある場合はSharedPreferencesをクリアしたい場合は、ファイルを削除しようとしないでください。 SharedPreferencesオブジェクトのedit().clear().commit()またはedit().clear().apply()に電話してください。

+0

投稿ありがとうございます!したがってSharedPreferencesインスタンスは永続化されたprefsをコピー/キャッシュするだけであり、単にjava.io.Fileオブジェクトのような参照を提供するだけではありません。最初のポイント:delete()は、ファイルが 'なぜ存在するのですか?だから、あなたはprefsのインプロセスコピーだけをテストするだろうか? – cody

+0

"SharedPreferencesインスタンスは確かに永続化された設定をコピー/キャッシュする" - そうです。実際には、あなたがその背後にあるファイルを混乱させると、それは好きではありません。 "delete()は、ファイルが存在しない場合は単にfalseを返すので、なぜチェックを行うのですか?" - あなたが 'delete()'からの戻り値を調べていないからです。 「そのため、プロセスのコピーをテストするだけですか?」 - 私は実際のAPIを使用します。 prefsをクリアして変更をコミットすると、ファイルの内容がクリアされます。 – CommonsWare

+0

さて、ファイルが削除前に存在していたのか、削除されたのかを確認したくなかったので、それが存在しないことを確認したかっただけです。ただ1つの質問:どのような種類のシステム提供の初期値がファイルに書き込まれていた可能性がありますか? – cody

関連する問題