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 )


+ Recent posts