[Android] SQLite DB 백업 및 복구
SQLite 백업 및 복구
백업 및 복구를 하기 전에 storage에 접근하기 위한 permission 권한을 가지고 있어야 합니다.
AndroidManifest.xml에서 manifest태그 안에 읽기와 쓰기에 대한 권한을 부여해줍니다.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
*백업*
앱 내부에 있는 파일을 스마트폰 저장공간(/Download)으로 복사하는 코드입니다.
getExternalStorageDirectory()는 /storage/emulated/0
getDataDirectory()는 /data
위치값을 가져옵니다.
FileChannel을 이용해서 파일을 복사해주고 close로 닫아주면 됩니다.
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
File currentDB = new File(data, "/data/패키지명/databases/파일명");
File backupDB = new File(sd, "/Download/파일명");
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(backupDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Snackbar.make(getView(), "백업이 완료되었습니다.", Snackbar.LENGTH_SHORT).show();
}
} catch (Exception e) {
Snackbar.make(getView(), "백업이 실패되었습니다.", Snackbar.LENGTH_SHORT).show();
}
*복원*
백업과 반대로 스마트폰 저장공간에 있는 파일을 앱 내부 공간으로 복사합니다.
try {
File sd = Environment.getExternalStorageDirectory();
File data = Environment.getDataDirectory();
if (sd.canWrite()) {
File currentDB = new File(sd, "/Download/DB파일");
File restoreDB = new File(data, "/data/패키지명/databases/DB파일");
FileChannel src = new FileInputStream(currentDB).getChannel();
FileChannel dst = new FileOutputStream(restoreDB).getChannel();
dst.transferFrom(src, 0, src.size());
src.close();
dst.close();
Snackbar.make(getView(), "복구가 완료되었습니다.", Snackbar.LENGTH_SHORT).show();
}
} catch (Exception e) {
Snackbar.make(getView(), "복구에 실패하였습니다.", Snackbar.LENGTH_SHORT).show();
}
※ 추가정보
- 파일 복사가 아닌 파일 이동의 경우 currentDB.delete()로 제거하면 됩니다.
try문에 진입하지 않고 catch로 넘어갈 경우
- catch에 어떤부분이 문제가 생겼는지 Log로 확인하면 됩니다.
-실행했을 때 제대로 실행되지 않고 open failed: EACCES (Permission denied)라고 예외처리가 되면 접근권한이 없으므로
manifest에 퍼미션 추가해주셔야합니다.
manifest - application 태그 안에 android:requestLegacyExternalStorage="true"를 작성하면 정상적으로 접근가능합니다.
try문은 진입했으나 if문을 들어가지 않을 경우
- sd.canWrite가 false를 반환하고 있을겁니다.
이 경우에는 앱에서 저장공간 액세스 권한이 없으므로 "설정-애플리케이션-앱-권한"에 들어가서 액세스 허용을 시켜줘야 합니다.
(퍼미션체크 설정: sseong66.tistory.com/64 )
'안드로이드 > Android' 카테고리의 다른 글
[Android] 다른 액티비티에서 환경설정(Preference) 사용하기 (0) | 2020.10.30 |
---|---|
[Android] 지문인식 구현하기 (0) | 2020.10.30 |
[Android] Date to String & String to Date (0) | 2020.09.17 |
[Android] 액션바에 Preferences 앱 설정화면 만들기 (0) | 2020.09.08 |
[Android] Intent로 화면 이동 및 데이터 전달 (0) | 2020.09.03 |