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

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

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

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

Android Studio

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

Q&A

解決済

1回答

1264閲覧

SharedPreferencesのキー名を変えたい

j06110611

総合スコア54

Java

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

Android Studio

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

0グッド

0クリップ

投稿2019/09/03 16:28

クイズを作って保存ができるアプリを作っていて、editTextに書かれた内容を保存したいのですが、同じキー名で2問以上を保存すると、
1問目に書かれたeditTextの内容が上書きされてしまいます。
そこで、makeQuiz_Button2が押されたらint型のcountで+1して、キー名を変えて上書きされないようにしようと考えて書きました
クイズを2問以上作り、Terminalでrun-as使ってうまく保存されているかを確認すると、countが0から+1されて1にはなっているのですが、
1から上がらないことが分かりました。
title1というキー名で2問のeditTextの内容は保存されたので、意味なく上書き保存されてしまいます。
原因はインテントで画面遷移をしてるので、Activityが切り替わるときにcountがまた0に初期化されていると予想はしているのですが、
どうすれば、countが0に初期化されずに済みますか?また、原因が違かったり、ほかにいい方法があれば教えてほしいです。

MainActivity

1public class MainActivity extends AppCompatActivity { 2 3 static ArrayList data = new ArrayList<>(); 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 10 // リスト項目とListViewを対応付けるArrayAdapterを用意する 11 final ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); 12 ; 13 // ListViewにArrayAdapterを設定する 14 ListView listView = (ListView) findViewById(R.id.listView); 15 listView.setAdapter(adapter); 16 Button button = (Button) findViewById(R.id.makeQuiz_Button1); 17 button.setOnClickListener(new View.OnClickListener() { 18 @Override 19 public void onClick(View v) { 20 Intent intent = new Intent(MainActivity.this, com.test.quizmaker.MakeQuizActivity.class); 21 startActivity(intent); 22 } 23 }); 24 } 25 public void addData(String addTitle){ 26 data.add(addTitle); 27 } 28} 29

MakeQuizActivity

1public class MakeQuizActivity extends AppCompatActivity { 2 int count; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_make_quiz); 8 9 Button button2 = (Button)findViewById(R.id.makeQuiz_Button2); 10 button2.setOnClickListener(new View.OnClickListener() { 11 @Override 12 public void onClick(View v) { 13 Intent intent2 = new Intent(MakeQuizActivity.this,com.test.quizmaker.MainActivity.class); 14 PreferenceManager pm = new PreferenceManager(); 15 MainActivity main = new MainActivity(); 16 SharedPreferences sp = getSharedPreferences("DataStore",MODE_PRIVATE); 17 SharedPreferences.Editor editor = sp.edit(); 18 pm.init(sp,editor); 19 String strTitle = ((EditText)findViewById(R.id.editText)).getText().toString(); 20 String strQuiz = ((EditText)findViewById(R.id.editText2)).getText().toString(); 21 String strAnswer = ((EditText)findViewById(R.id.editText3)).getText().toString(); 22 count ++; 23 pm.saveString(strTitle, PreferenceManager.DataKeys.TITLE, String.valueOf(count)); 24 String title = sp.getString(PreferenceManager.DataKeys.TITLE.getValue() + String.valueOf(count), "Nothing"); 25 main.addData(title); 26 startActivity(intent2); 27 } 28 }); 29 } 30}

PreferenceManager

1public class PreferenceManager{ 2 3 public SharedPreferences sp; 4 public SharedPreferences.Editor spEditor; 5 List<String> titleList = new ArrayList<>(); 6 7 public enum DataKeys { 8 TITLE("title"), QUIZ("quiz"), ANSWER("answer"); 9 10 private String value; 11 12 private DataKeys(String value) { 13 this.value = value; 14 } 15 public String getValue() { 16 return this.value; 17 } 18 } 19 20 public void init(SharedPreferences sp, SharedPreferences.Editor editor) { 21 this.sp = sp; 22 this.spEditor = editor; 23 } 24 25 public void saveString(String s, DataKeys key, String count){ 26 spEditor.putString(key.getValue() + count,s); 27 spEditor.apply(); 28 } 29} 30

そもそもこういう保存にSharedPreferencesに向いていないことは知っています・・・。
データベースを使って保存をするのが良いみたいなのですが、まだデータベースの使い方の知識がないうえ、
もともとファイル保存で進めてたんですけど、今後、クイズの題名、問題、解答と分類して保存したいのでキー名で分けられて簡単なSharedPreferencesを使うことにしました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

count も SharedPreferences に入れては如何でしょうか.
読むときに「いくつクイズが保存されているか」は必要になりそうに思いますし.


button2 の OnClickListener の onClick メソッド内での保存部分のみを書きますと, 以下のようになるかと思います.
count を取り出して加算し, キーに付与してデータを保存するついでに, count も保存します.

java

1 //データ取得 2 String strTitle = ((EditText)findViewById(R.id.editText )).getText().toString(); 3 String strQuiz = ((EditText)findViewById(R.id.editText2)).getText().toString(); 4 String strAnswer = ((EditText)findViewById(R.id.editText3)).getText().toString(); 5 //番号決定 6 SharedPreferences sp = getSharedPreferences("DataStore", MODE_PRIVATE); 7 int count = sp.getInt("count", 0) + 1; 8 //保存 9 SharedPreferences.Editor editor = sp.edit(); 10 editor.putInt("count", count); 11 editor.putString("title" + count, strTitle ); 12 editor.putString("quiz" + count, strQuiz ); 13 editor.putString("answer"+ count, strAnswer); 14 editor.apply();

投稿2019/09/03 17:23

編集2019/09/05 10:16
jimbe

総合スコア12646

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

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

j06110611

2019/09/05 07:17

書くのを忘れてしまっていましたが、まずはキー名を変えて保存ができてからカウントも保存しようと思っています。
jimbe

2019/09/05 10:48 編集

問題を分けることは大事ですが, 密に関係する箇所を分けることで逆に複雑になることもありますし, 発想の転換とお考え頂いても良いです. 回答を追加致しました. なお蛇足になりますが, > MainActivity main = new MainActivity(); > main.addData(title); というのは, 相当無理矢理です. [アクティビティから結果を取得する]( https://developer.android.com/training/basics/intents/result?hl=JA ) という構造が用意されていますので, こちらをご利用頂くと良いかと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問