【Android】ローカルファイルからデータを出し入れする
アプリ用のデータの保存場所は大きく
・外部のサーバー
・スマホの、アプリ固有のファイルフォルダ
・スマホの外部ストレージ(共有ファイルフォルダやSDカード)
の3つに分けられますが、今回は手堅い二番目の方法で。
ただし、容量の大きいデータや読み書き頻度の高いデータをここに置くのはあんまり良くないらしいので運用には注意。
保存する
public void saveData(@NonNull Context context, String filename, String file_contents){
try(FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE)){
fos.write(file_contents.getBytes(StandardCharsets.UTF_8));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
FileOutputStreamを用意して、writeメソッドで書き込めばOK。
ちなみに公式ドキュメントのこの部分のコード、
fos.write(fileContents.toByteArray());
って書いてあるけど、JavaのStringクラスにToByteArray()ってメソッドないんだよなぁ……とりあえず数字を放り込んでみた限りではgetBytes()で問題なく動きました。
「ボタンを押したら保存」にする
っていうか本当は先に「ボタンを押したらなんか反応する」を作って、その後「なんか反応する」の部分を「保存する」に置き換えるんですけど記事の構成間違えたね。自分メモだからいいね。
入力欄とボタンを作る
<EditText
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:id="@+id/editText"
android:hint="ここに入力"
></EditText>
<Button
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="1"
android:onClick="getInput"
android:text="保存"
></Button>
つくる。onClick属性にはこれから作るメソッドの名前を指定する。
ボタンを押したら反応するメソッドを作る
public void getInput(View view){
EditText editText = findViewById(R.id.editText);
TextView textView = findViewById(R.id.textView);
int add = Integer.parseInt(String.valueOf(editText.getText()));
int now = Integer.parseInt(String.valueOf(textView.getText()));
int newValue = add + now;
saveData(view.getContext(), "now", String.valueOf(newValue));
textView.setText(String.valueOf(newValue));
editText.setText("0");
}
xml側でonClick属性にこのメソッドを指定したので、ボタンをタップするとこのメソッドが呼ばれる。このメソッドがsaveDataメソッドを呼ぶ。
saveDataメソッドの引数のcontextには、ViewからgetContextして渡してみているけどこれが本当に正しいのかはわかんない。とりあえず動いた。
ファイルの内容を読み込む
protected String readFile(@NonNull Context context, String filename) throws FileNotFoundException {
FileInputStream fis = context.openFileInput(filename);
InputStreamReader inputStreamReader = new InputStreamReader(fis, StandardCharsets.UTF_8);
StringBuilder stringBuilder = new StringBuilder();
try(BufferedReader reader = new BufferedReader(inputStreamReader)){
String line = reader.readLine();
while(line != null){
stringBuilder.append(line).append('\n');
line = reader.readLine();
}
} catch (IOException e) {
e.printStackTrace();
return "0";
}finally{
String contents = stringBuilder.toString();
return contents;
}
}
とりあえず「これで動いたぞ」っていうメモ。
onCreateメソッドから呼ぶ時はcontextにthis(MainActivityクラス自身を表すthis)を渡したら動いた。
ほぼ公式の写経でまだ細かい所はよくわかんないけど、これでとりあえずは動く。
この記事が気に入ったらサポートをしてみませんか?