質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2391閲覧

アプリ終了後、SharedPreferencesが書き換わっている

kbys32

総合スコア55

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/04/29 13:48

編集2018/04/30 05:20

お世話になります。

前提・実現したいこと

アプリを終了後、シェアードプレファレンスが書き換わるのを阻止したいです。

下記コードを実行して、DaysReportのTheTimeOfStartというキーが示す文字列(最初は"")の次に、変数hm内の半角数字と改行文字を付けて保存しました。

java

1 private void SetData(String sagyoumei,int hm,int sagyousuu) 2 { 3 SharedPreferences sharedPreferences=getSharedPreferences("DaysReport",MODE_PRIVATE); 4 SharedPreferences.Editor editor=sharedPreferences.edit(); 5 String oldData=sharedPreferences.getString("TheTimeOfStart",""); 6 7 editor.putString("TheTimeOfStart",oldData+hm+"\n"); 8 9 editor.apply(); 10 }

しかし、その後アプリを終了し、再びアプリを起動、onCreate関数内で、

java

1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 setContentView(R.layout.activity_main); 5 SharedPreferences sharedPreferences=getSharedPreferences("DaysReport",MODE_PRIVATE); 6 String oldData=sharedPreferences.getString( "TheTimeOfStart",""); 7}

を行い、上記のoldData内を参照すると、保存した正しい文字列の次に、半角スペースが4つ付いていました。
どうすれば、この現象を阻止できますか。

試したこと

シェアードプレファレンスに保存後、アプリを終了させる前に、onPause,onStopでは、値が書き換わっていないことを確認しました。
また、上記改行文字を/に差し替えた所、書き換えが起きないことを確認しました。
エスケープシークエンス関連だとは思うのですが、なぜそうなるのか詳しく分かりません。

補足情報(FW/ツールのバージョンなど)

Android studio 3.1.1使用

宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

これは原因がよくわからないですね。実験してみましたが、出力文字列の末尾が"\n"のような制御文字であった場合、確かに実際の出力には空白文字が4文字分付加されてしまうようです。

Java

1 editor.putString("TheTimeOfStart",oldData+hm+"\n.");

のように、制御文字の後に一文字付け加えると、空白文字は付加されないようですね。

元々、SharedPreferencesの保存データの実体はXMLによる平文テキストなので、制御文字のような非・印刷可能文字を保存するには向きません。それでも制御文字を与えると、"
"のようにコードを表す文字に変換されて保存されるのですが、そのときの処理に何か不具合があるのかもしれません。

消極的回答ですが、こうした問題があるので制御文字を含めて保存するのは避けた方がいいのではないでしょうか。

投稿2018/04/30 08:16

編集2018/04/30 08:35
keicha_hrs

総合スコア6768

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kbys32

2018/04/30 08:26

わかりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問