バックアップ機能の実装 ~Androidアプリの作り方~
実用的なアプリを作るには、バックアップ機能は必須だと思うので何とか作ってみた。
わかってみるとそんなに難しくないんだけど、ちょっとつっかかるところもあったので、まとめてご紹介します。
○バックアップを保存する機能の実装
・保存するディレクトリ名を決める
毎回入力するのは面倒なので、年月日と時間で勝手にディレクトリ名を生成するようにした。
日時を取得する方法を使って以下のようにした。
Calendar now = Calendar.getInstance();
date = String.format("%04d%02d%02d_%02d%02d%02d", now.get(now.YEAR), now.get(now.MONTH) + 1, now.get(now.DATE), now.get(Calendar.HOUR_OF_DAY), now.get(Calendar.MINUTE), now.get(Calendar.SECOND));
毎回桁数が変わらないようにString.formatを使って、「1」→「01」のように0を追加している。
・ディレクトリを作成する
上記で作成した文字列に、わかりやすいように「backup_」という文字列を足して、ディレクトリを作成する。
String dir = getFilesDir() + "/backup_" + date;
File file = new File(dir);
if(file.mkdir() == true){
//ここにファイルをコピーする処理を書く
}
file.mkdir()を実行して、ディレクトリの作成に成功したらファイルのコピーを行うようにする。
・ファイルをコピーする
ファイルを単純にコピーできればよかったんだけど、調べても方法がわからなかったので、一旦読み込んで、書き込むということをする。
以下の例では、readStringにデータを読み込んであるとした時の、書き込み処理。
try {
OutputStream fileOutputStream = new FileOutputStream(dir + "/" + file_name);
fileOutputStream.write(readString.getBytes());
fileOutputStream.close();
err_flag = "OK";
} catch (FileNotFoundException e) {
err_flag = "NG";
} catch (IOException e) {
err_flag = "NG";
}
ファイルの書き込みは、上記のようにFileOutputStreamを使うと、パス(ディレクトリ名)を指定できる。
openFileOutputでは、パスは指定できないらしい。
○バックアップを削除する機能の実装
削除するバックアップのディレクトリを取得する操作は別途作るとして、削除するバックアップのディレクトリがdirとして得られたとすると以下のように削除することができる。
if(dir.matches(".*/backup_[0-9]+_[0-9]+") == true){
int i;
for(i = 0; i < 6; i++){
File file = new File(dir + "/" + file_name[i]);
file.delete();
}
File del_dir = new File(dir);
del_dir.delete();
}
念のため、ディレクトリ名をチェックした後、ファイル名のリストfile_name[i]について、file.delete()でファイルを削除した後に、del_dir.delete()でディレクトリを削除している。
○バックアップを復元する機能の実装
処理的には、バックアップを保存する処理とたいして変わらないが、パスを指定して、読み込む場合には、BufferedReaderというのを使うとパスを指定して読み込むことができる。
File file = new File(dir + "/" + file_name[i]);
FileReader filereader = new FileReader(file);
BufferedReader br = new BufferedReader(filereader);
while ( (readText = br.readLine()) != null ){
readString += readText;
}
br.close();
・バックアップリストを表示する機能 の実装
特定のディレクトリの下にあるファイル名のリストを取得して、ディレクトリ名のパターンで絞り込んでいる。
File cd = getFilesDir();
for(int j = 0; j < cd.listFiles().length; j++){
if(cd.listFiles()[j].getName().matches("backup_[0-9]+_[0-9]+") == true){
text += cd.listFiles()[j].getName() + BR;
id++;
}
}
これらを組み合わせると、アプリがインストールされているディレクトリの下にバックアップを保存することができるようになる。