StringとStringの2つのデータータイプ型を配列に入れてそれを保存したいと思っています。手順は下記の通りです。
1)まずデータタイプとセッター&ゲッターを作成。
2)次に保存用のSharedPreferencesを使ったPrefManagerを作成。
3)最期にMainActivityにセット。
実行すると
FATAL EXCEPTION: main Process: com.○○○.datatypearrayapp, PID: 2817 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.○○○.datatypearrayapp/com.○○○.datatypearrayapp.MainActivity}: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.get(ArrayList.java:411) at com.○○○.datatypearrayapp.MainActivity.onCreate(MainActivity.java:43) at android.app.Activity.performCreate(Activity.java:6679) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method)
と言うエラーが出て保存した(はず)データが取得できません。
上記エラーは「データが無いよ」と言っているような気がしますが
理由が分かりません。
質問は
1)単体のString型のArrayListを保存する時はJSONArrayに一旦入れてSharedPreferencesで
問題なく保存できるのですが複数のデータ型をJSONArrayに入れることができないのでしょうか?
2)もしできるならPrefManagerのコード記述が間違っている箇所があるでしょうか?
3)もしできないなら他にどういった手法があるでしょうか?
swiftのタプルを配列にするような方法はないのでしょうか?
よろしくお願いします。
環境 os mac
開発環境 Android studio 2.2.3
DataType.java
public class DataType { private String kuji_contents; private String kuji_number; //コンストラクタ public DataType( String kuji_contents, String kuji_number){ this.kuji_contents = kuji_contents; this.kuji_number = kuji_number; } public String getKuji_contents() { return kuji_contents; } public void setKuji_contents(String kuji_contents) { this.kuji_contents = kuji_contents; } public String getKuji_number() { return kuji_number; } public void setKuji_number(String kuji_number) { this.kuji_number = kuji_number; } }
PrefManager.java
public class PrefManager { //ArrayDataListをjsonArrayにして保存するメソッド public static void saveDataList(Context ctx, String key, ArrayList<DataType> list){ JSONArray jsonArray = new JSONArray(); for (int i = 0; i < list.size(); i++){ jsonArray.put(list.get(i)); } SharedPreferences preferences = ctx.getSharedPreferences("PrefFile", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putString(key, jsonArray.toString()); editor.apply(); } //保存されているjsonArrayからArrayListに取得するメソッド public static ArrayList<DataType> loadDataList(Context ctx, String key){ ArrayList<DataType> list = new ArrayList<>(); SharedPreferences preferences = ctx.getSharedPreferences("PrefFile", Context.MODE_PRIVATE); String strJson = preferences.getString(key, ""); if (!strJson.equals("")){ try { JSONArray jsonArray = new JSONArray(strJson); for (int i = 0; i < jsonArray.length(); i++){ list.add((DataType) jsonArray.get(i)); } }catch (Exception e){ e.printStackTrace(); } } return list; } }
MainActivity.java
public class MainActivity extends AppCompatActivity { ArrayList<DataType> dataTypeArrayList; ArrayList<DataType> dataTypeArrayListNext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dataTypeArrayList = new ArrayList<>(); String[] contentData = { "あたり", "はずれ" }; String[] numberData = { "1", "2" }; for (int i = 0; i < contentData.length ; i++) { String kuji_contents = contentData[i]; String kuji_number = numberData[i]; dataTypeArrayList.add(new DataType( kuji_contents, kuji_number )); } PrefManager.saveDataList(getApplicationContext(),"testArray",dataTypeArrayList); dataTypeArrayListNext = PrefManager.loadDataList(getApplicationContext(),"testArray"); Log.d("UAA", String.valueOf(dataTypeArrayListNext.get(0))); } }
回答3件
あなたの回答
tips
プレビュー