見出し画像

【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)を渡したら動いた。

ほぼ公式の写経でまだ細かい所はよくわかんないけど、これでとりあえずは動く。

この記事が気に入ったらサポートをしてみませんか?