質問: お世話になります。 ### 前提・実現したいこと アプリを終了後、シェアードプレファレンスが書き換わるのを阻止したいです。 下記コードを実行して、DaysReportのTheTimeOfStartというキーが示す文字列(最初は"")の次に、変数hm内の半角数字と改行文字を付けて保存しました。 ``` private void SetData(String sagyoumei,int hm,int sagyousuu) { SharedPreferences sharedPreferences=getSharedPreferences("DaysReport",MODE_PRIVATE); SharedPreferences.Editor editor=sharedPreferences.edit(); String oldData=sharedPreferences.getString("TheTimeOfStart",""); editor.putString("TheTimeOfStart",oldData+hm+"\n"); editor.apply(); } ``` しかし、その後アプリを終了し、再びアプリを起動、onCreate関数内で、 ``` @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SharedPreferences sharedPreferences=getSharedPreferences("DaysReport",MODE_PRIVATE); String oldData=sharedPreferences.getString( "TheTimeOfStart",""); } ``` を行い、上記のoldData内を参照すると、保存した正しい文字列の次に、半角スペースが4つ付いていました。 どうすれば、この現象を阻止できますか。 ### 試したこと シェアードプレファレンスに保存後、アプリを終了させる前に、onPause,onStopでは、値が書き換わっていないことを確認しました。 また、上記改行文字を/に差し替えた所、書き換えが起きないことを確認しました。 エスケープシークエンス関連だとは思うのですが、なぜそうなるのか詳しく分かりません。 ### 補足情報(FW/ツールのバージョンなど) Android studio 3.1.1使用 宜しくお願い致します。
回答: これは原因がよくわからないですね。実験してみましたが、出力文字列の末尾が"\n"のような制御文字であった場合、確かに実際の出力には空白文字が4文字分付加されてしまうようです。 ``` editor.putString("TheTimeOfStart",oldData+hm+"\n."); ``` のように、制御文字の後に一文字付け加えると、空白文字は付加されないようですね。 元々、SharedPreferencesの保存データの実体はXMLによる平文テキストなので、制御文字のような非・印刷可能文字を保存するには向きません。それでも制御文字を与えると、" "のようにコードを表す文字に変換されて保存されるのですが、そのときの処理に何か不具合があるのかもしれません。 消極的回答ですが、こうした問題があるので制御文字を含めて保存するのは避けた方がいいのではないでしょうか。