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

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

ただいまの
回答率

88.23%

android SharedPreferences 使い方 保存方法

解決済

回答 2

投稿 ・編集

  • 評価
  • クリップ 0
  • VIEW 3,674

shinshin

score 32

質問よろしくお願いします。

まだまだ勉強したての初心者です。

androidの開発中でゲームを作成していて、
今回のゲーム結果をA部分にタイム表示し、それをBの部分に保存(前回のデータを上回っていたら書き換え)
という風にしたいのですが、まず保存自体が四苦八苦しておりできません。

コード

SharedPreferences pref = this.getSharedPreferences("user_data", Context.MODE_PRIVATE);

            // プリファレンスに書き込むためのEditorオブジェクト取得
            Editor editor = pref.edit();
            // user_id というキーで値を保存
            editor.putString("user_id", inputs);//inputsは秒数を表示しているtextview
            // ここで実際にファイルに書き込む
            editor.commit();

            // 保存されている値を呼び出し
            ((SharedPreferences) tv2).getInt("user_id", -1);//textviewのtv2に表示したい

今記述しているコードは上記ですがエラーが出ます。
デバッグで見てみてもtv2には反映されていません。

上記の正しい記述や解決方法、できれば前回の記録との比較方法も教えて頂けたらありがたいです。

ご教授よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

A,B,C部分て何をさしていますか?
質問とコードを照らし合わせてもその辺があまり読み取れないです。

ですので追記のコードでおかしそうな部分を指摘します。
editor.commit()を2回していますが、その間に値の変更処理はないので最後のeditor.commit()は意味が無いです。

ちなみに以下のメソッドの第2引数はデフォルト値です。
値が存在しなかった場合に取得する値です。
pref1.getString("g2byou", inputs)

的外れでしたらすみません。

追記:
適当なサンプルを実装してみました。
ボタンを押下するとランダム値と最大値がTextViewに表示されます。
最大値はPrefarenceに保存しているのでアプリ再起動後も有効です。
レイアウトはTextView2つ、Button1つなので適当に作成してください。

    private TextView textViewA;
    private TextView textViewB;
    private SharedPreferences pref;
    private int max;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textViewA = (TextView) findViewById(R.id.textView1);
        textViewB = (TextView) findViewById(R.id.textView2);
        Button button = (Button) findViewById(R.id.button1);
        pref = getSharedPreferences("user_data", MODE_PRIVATE);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                int value = (int) (Math.random() * 1000);
                if (value > max) {
                    max = value;
                    pref.edit().putInt("max", max).commit();
                    textViewB.setText("" + max);
                }
                textViewA.setText("" + value);

            }
        });
        max = pref.getInt("max", 0);
        textViewA.setText("");
        textViewB.setText("" + max);

    }

追記2:
なるべく変更しないで修正しました。
コンパイルも行っていないのでそのまま動くか不明です。

画面遷移で変更した部分があります。
各画面(2,3,4)から遷移する場合に画面IDをIntentに"INPUTid"としてセットしてあげてください。なので画面毎に"INPUT","INPUT3","INPUT4"と分けないで"INPUT","INPUTs","INPUTms"で統一して修正してください。



   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        Intent intent = getIntent();

        TextView textview1 = (TextView) findViewById(R.id.textView1);
        TextView textview3 = (TextView) findViewById(R.id.textView3);
        TextView textview5 = (TextView) findViewById(R.id.textView5);

        TextView tv1 = (TextView) findViewById(R.id.tv1);
        TextView tv2 = (TextView) findViewById(R.id.tv2);
        TextView tv3 = (TextView) findViewById(R.id.tv3);

        TextView tv4 = (TextView) findViewById(R.id.tv4);
        TextView tv5 = (TextView) findViewById(R.id.tv5);
        TextView tv6 = (TextView) findViewById(R.id.tv6);

        TextView tv7 = (TextView) findViewById(R.id.tv7);
        TextView tv8 = (TextView) findViewById(R.id.tv8);
        TextView tv9 = (TextView) findViewById(R.id.tv9);

        int id = intent.getIntExtra("INPUTid", -1); // 画面idを送る
        String hun = intent.getStringExtra("INPUT");
        String byou = intent.getStringExtra("INPUTs");
        String mbyou = intent.getStringExtra("INPUTms");
        textview1.setText(hun);
        textview3.setText(byou);
        textview5.setText(mbyou);

        int ihun = Integer.valueOf(hun);
        int ibyou = Integer.valueOf(byou);
        int imbyou = Integer.valueOf(mbyou);

        showScore(tv1, tv2, tv3, 2, id, ihun, ibyou, imbyou);
        showScore(tv4, tv5, tv6, 3, id, ihun, ibyou, imbyou);
        showScore(tv7, tv8, tv9, 4, id, ihun, ibyou, imbyou);

    }

    private void showScore(TextView tf, TextView ts, TextView tt, int id, int rcvId, int hun, int byou, int mbyou) {
        SharedPreferences pref = getSharedPreferences("user_data", MODE_PRIVATE);
        int minhun = pref.getInt("g" + id + "hun", 60);
        int minbyou = pref.getInt("g" + id + "byou", 60);
        int minmbyou = pref.getInt("g" + id + "mbyou", 1000);
        if (minhun >= 60) {
            tf.setText("");
            ts.setText("");
            tt.setText("");
        } else {
            tf.setText(minhun + "");
            ts.setText(minbyou + "");
            tt.setText(minmbyou + "");
        }
        if (id == rcvId) {
            long msec = (hun * 60 + byou) * 1000 + mbyou;
            if ((minhun * 60 + minbyou) * 1000 + minmbyou > msec) {// 更新してたら上書き
                pref.edit().putInt("g" + id + "hun", hun).putInt("g" + id + "byou", byou)
                        .putInt("g" + id + "mbyou", mbyou).commit();
                tf.setText(hun + "");
                ts.setText(byou + "");
                tt.setText(mbyou + "");
            }
        }
    }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/23 15:16

    > 49 textview1.setText(hun);
    上記でNullPointerExceptionが発生しているのはtextview1に値をいれていないからです。
    メンバ変数のtextview1にfindViewByIdで値を入れる必要があります。ローカル変数でスコープを上書きしているとメンバ変数はnullのままです。
    私のコードそのままだとNullPointerExceptionは発生しないはずです。

    キャンセル

  • 2014/10/23 15:29

    メンバ変数を利用しないでメソッド内で完結するようにコードを修正したので試してみてください。

    キャンセル

  • 2014/10/23 22:47

    omochiさん
    お世話になっております。

    ありがとうございます。
    アンインストールの心配もあったので新しいプロジェクトを作成し実行したら教えて頂いたコードのままでできました!!

    もう自分の実力ではまだまだかかるであろう問題に長々とお付き合い頂いて本当に助かりました!
    デバッグやLogCatの事など自分の先にするべき事もわかりました!

    本当にありがとうございました。

    キャンセル

0

斜め読みです
putString しているのに getInt なんですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2014/10/16 10:04

    ご意見ありがとうございます。

    そうですよねそこもおかしいですね。

    質問のあとに自分でまだ調べていたら下に反映するとこまではいけたのですが保存されません。
    質問を編集追記します。
    よろしかったらまたご意見ください。

    キャンセル

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る