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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Android Studio

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

Q&A

解決済

1回答

2093閲覧

保存のされ方を教えてほしいです

j06110611

総合スコア54

Android Studio

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

0グッド

0クリップ

投稿2019/08/12 04:43

編集2019/08/12 08:20

クイズを作れるアプリを作っています。
アプリが閉じられても更新ができるようにするために、
1問作るごとにmakeQuiz_Button2が押す必要があって押されるとクイズの題名を保存するようにしてるんですけど、2問目の題名を保存したときに、1問目が上書きされてしまうのか、どうなのかがよくわからなくて困っています。
確認方法でもいいですし、解説でもいいので教えていただきたいです。

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 // ListViewにArrayAdapterを設定する 13 ListView listView = (ListView) findViewById(R.id.listView); 14 listView.setAdapter(adapter); 15 Button button = (Button) findViewById(R.id.makeQuiz_Button1); 16 button.setOnClickListener(new View.OnClickListener() { 17 @Override 18 public void onClick(View v) { 19 Intent intent = new Intent(MainActivity.this, com.test.quizmaker.MakeQuizActivity.class); 20 startActivity(intent); 21 } 22 }); 23 } 24 public void addData(String addTitle){ 25 data.add(addTitle); 26 } 27} 28

MakeQuizActivity

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

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){ 26 spEditor.putString(key.getValue(),s); 27 spEditor.apply(); 28 } 29} 30

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

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

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

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

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

y_waiwai

2019/08/12 05:55

現状のコードではどういう動作になるんでしょうか?
j06110611

2019/08/12 08:15

activity_main.xmlにあるmakeQuiz_Button1を押すと、makequiz.xmlにいってそこにあるeditTextに クイズの題名を書いて、makeQuiz_Button2を押すとeditTextに書かれた文字列がPreferenceManagerにあるSharedPreference型のspに列挙型TITLEの列挙子(title)をキーとしてで保存されます。 保存されたのを読み込んでactivity_main.xmlのListViewに表示されます。
guest

回答1

0

ベストアンサー

SharedPreferences は Map の構造を持ち, キーと値の組み合わせで保存されます.
同じキーを指定した場合は変更することになります.
元々設定値等を保存するためのもので, データストレージ目的ではありません.
データの保存には普通にファイルを使用するべきかと思います.

投稿2019/08/12 10:20

jimbe

総合スコア12545

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

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

j06110611

2019/08/13 03:23

同じキーを指定した場合は何を変更するんですか? 要は2問以上の題名を同じキーの名前で保存するとと1問目の題名は上書きされるのですか? ファイルを使用しようと最初は思ったのですが、問題、解答も今後保存するのでキーで分類したいからです
jimbe

2019/08/13 04:59

題名に限らず, 同じキーで設定すれば, 上書きになります. "title" に "a" を保存した後同じ "title" で "b" と保存すると, "title" を取り出した時 "b" が出てきます. 「キー」を「変数名」と思っても良いかもしれません. > ファイルを使用しようと最初は思ったのですが、問題、解答も今後保存するのでキーで分類したいからです 件のゲームの内容からすれば, title・quiz・answer の組は Map か専用クラスを用い, それを配列やリストなどに複数保持し(さらにそれらを専用クラスにする手もあります), それらをファイルに入出力するという構造がよいかと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問