2016-10-18 5 views
1

나는 안드로이드 애플 리케이션 개발에 비참한 초심자입니다. 그러나 현재 프로젝트에서 현장 관찰을 기록한 (연구 과학자) 앱을 만들어 SQLite 데이터베이스에 저장해야합니다.이 데이터는 처리를 위해 중앙 위치로 전송됩니다. 앱이 태블릿에서 사용됩니다.안드로이드 타블렛 내부 메모리 (API 23)에 SQLite 데이터베이스 저장

현재 Android Studio를 사용하고 있으며 앱 기능을 에뮬레이트 할 때 모든 기능이 계획대로 작동하며 DB Browser for SQLite을 사용하면 값이 데이터베이스에 올바르게 기록되고 있음을 알 수 있습니다.

물론

/data/data/<your.app.package>/databases/foo.db

이 안드로이드에서 액세스 : 연구를하는

, 내가 데이터베이스 (.db) 파일이 디렉토리 경로에 저장되는 것을 알고있다 (예를 들어 대답 here됩니다) Studio,하지만 내 이해 장치가 뿌리면 않는 한, 이러한 파일은 실제 장치에서 액세스 할 수 있습니다. 여러 가지 이유로, 이것은 내가 관련되어있는 작업을위한 선택 사항이 아닙니다.

연구에서 나는 Backup/restore sqlite db in android [duplicate]과 중복 된 대상 Android backup/restore: how to backup an internal database?에 대한 대답과 같이 데이터베이스를 백업하고 SD 카드에 백업 데이터베이스를 저장하는 방법을 발견했습니다.

23 이상의 API를 사용하는 SD 카드와 같은 외부 저장 장치에 저장하면 외부 소스에 기록하는 데 훨씬 많은 권한이 필요합니다 (Manifest에서 항상 필요했던 것 이상). 여러 가지 이유로이 옵션은 최적이 아닙니다.

this answer에서 백업은 SD 카드에 저장됩니다

final String inFileName = "/data/data/<your.app.package>/databases/foo.db"; 
File dbFile = new File(inFileName); 
FileInputStream fis = new FileInputStream(dbFile); 

String outFileName = Environment.getExternalStorageDirectory()+"/database_copy.db"; 

// Open the empty db as the output stream 
OutputStream output = new FileOutputStream(outFileName); 

// Transfer bytes from the inputfile to the outputfile 
byte[] buffer = new byte[1024]; 
int length; 
while ((length = fis.read(buffer))>0){ 
    output.write(buffer, 0, length); 
} 

// Close the streams 
output.flush(); 
output.close(); 
fis.close(); 

하지만, 내 질문에 (아마도 뇌 방귀 타입)입니다 - 은 가능한 백업이 내부 파일로 저장 한 것입니다 (예 : Documents 폴더), 권한이 여전히 필요합니까?

+0

기기의 내부 파일은 무엇을 의미합니까? –

+0

@HRaval은 장치 자체의 액세스 가능 영역에 저장됩니다 (따라서 필자의 예제에서는 'documents'폴더 또는 이와 동등한 것으로 말함). –

+0

"공공 환경"에 저장할 수 없습니다. 그러나 내부 앱 폴더 (이 사용자는 액세스 할 수 없음)에 백업 할 수 있습니다. "처리를 위해 중앙 위치로 전송됩니다"수동으로 하시겠습니까? – crgarridos

답변

1

낭비의 흐름을 달성하는 것은 복잡하지 않습니다. 내가 도움을주기 위해 만든 Here is a class. 이에서 MainActivity를 확장 할 수 있고, 당신은 호출 할 수 있습니다 : 그것은 안드로이드 지원 라이브러리를 사용하여 모든 안드로이드 버전의 작동

verifyStoragePermissions(new Runnable() { 
    @Override 
    public void run() { 
     //backup your db here... 
    } 
}); 

.

+0

이것은 정확히 내가하고 싶었던 것입니다 - 감사합니다! –