2012-05-01 10 views
2

안드로이드에서 SQLite DB를 백업하고 복원하는 것이 가장 좋은 방법이 무엇인지 알고 싶습니다. 현재 나는 DB를 백업하고 파일 입력/출력 스트림을 사용하여 SD 카드에 복사함으로써이 문제에 접근합니다. 그런 다음 이전 백업을 복원하려면 역 프로세스를 사용합니다.Sqlite DB 안드로이드 백업/복원

이 방법은 효과가있는 것 같지만 아직 내 데이터가 손상되지 않았습니다. 이것이 최선의 접근 방법인가, 아니면 더 안전한 방법이 있는지 궁금합니다.

감사합니다.

답변

4

이것은 최상의 접근 방식 인 것처럼 보입니다. 추가 보증을 위해 SQLite 파일을 복사하고 대상 파일과 비교하기 전에 SQLite 파일의 체크섬을 고려하는 것이 좋습니다. 복사본을 가져올 때 데이터베이스에 열린 연결이 없는지 확인하십시오. 그렇지 않으면 복원시 예기치 않은 상태로 DB가 종료 될 수 있습니다.

내가 할 수있는 유일한 방법은 DB의 실제 내용을 읽고 복원 할 수있는 SQL을 포함하는 파일을 생성하는 것입니다. 이것은 분명 더 복잡하고 불가능합니다. 이러한 복잡성을 정당화하기 위해 어떤 이점도 제공합니다.

16

데이터베이스를 백업하기 만하면됩니다. 나는 현재 앱에서 위에서 설명한 것과 같은 방식으로이 작업을 수행합니다. 이 방법으로 백업을 만들 때주의하십시오. 대부분의 경우 잘 작동하지만 문제는 생성 된 백업이 모든 기기 및 Android 버전과 호환된다는 보장이 없다는 것입니다. 나는 처음 들었을 때 이것이 이상하게 들렸다 고 생각했지만, 이제는 그것이 사실이라는 것을 알게되었습니다. 최근에 누락 된 데이터, 사라지는 데이터 등 여러 가지 보고서를 받았습니다. 이것은 사용자가 다른 장치 나 다른 Android 버전 또는 ROM에서 백업을 복원 할 때 모두 발생했습니다. 그들 중 몇 명은 저에게 직접 연락을했는데 훌륭한 사람이었습니다. 그래서 그들을 테스트하고 조사하기 위해 백업 파일을 얻을 수있었습니다. 내가 그들을 복원하려고 할 때, 나는 다음과 같은 로그 캣 오류가 발생합니다 : android.database.sqlite.sqlitedatabasecorruptexception : 데이터베이스 디스크 이미지가

이었다 내가 찾는 한 그, 주로 특정 HTC 장치와 일부 사용자 지정 형식이 잘못되었습니다 rom (어떤 장치에서든)은 다른 장치 나 ROM으로 복원하지 못하는 이러한 백업을 생성합니다. 데이터베이스는 실제로 손상되지 않았지만 안드로이드는 그들이 생각했다. 나는 그것들을 SQLite 브라우저로 가져갈 것이고 어떤 데이터도 거기에 나타나지 않을 것이다. 최신 버전의 SQLite는 기본적으로 WAL (Write Ahead Logging)이 활성화되어 있고 활성화되어 있고 해당 데이터베이스를 사용하여 백업 한 경우 이전 버전의 SQLite 또는 때로는 동일한 버전으로 복원 할 수 없습니다. 어떤 이상한 이유). 그래서 저는 "PRAGMA journal_mode = DELETE"로 WAL을 비활성화 시켰고 브라우저에서 데이터베이스를 볼 수 있었고 테스트 장치에서 정상적으로 복원 할 수있었습니다. 다른 문제는 코드에서이 예외를 잡는 방법이없는 것처럼 보이고 안드로이드는이 예외를 겪을 때 데이터베이스를 자동으로 삭제한다는 것입니다 (안드로이드 측에서 매우 나쁜 관리라고 생각합니다).

긴 응답을 드려 죄송합니다.하지만 이런 종류의 백업으로 내가 뭘보고 있었는지 설명하고 싶었습니다. SD 카드에서 범용 백업을 만드는 또 다른 방법을 찾으려고합니다. @ Kingamajick과 같은 csv 파일과 sql 스크립트를 작성하는 것은 그것을 수행하는 또 다른 방법 일 수 있다고합니다. 그것은 더 많은 코드와 더 많은 작업이지만, 그것이 어떤 장치, SQLite 버전과 ROM에서 작동한다면 그것은 그만한 가치가있을 것입니다. 고객의 데이터 손실은 결코 좋은 일이 아닙니다.

+0

문제점을 발견 한 API 릴리스를 지정할 수 있습니까? –

+1

Android 2.3을 실행하는 HTC 장치에서이 문제가 발생했습니다. 또한 CM7 및 CM9 ROM에서도 확인했습니다. 그것은 모든 HTC 장치, 가장 주목할 만하게 Desire 시리즈가 아니다. 분명히 그 HTC 장치와 Cyanogemod는 기본적으로 SQLite에서 활성화 된 WAL을 가지고 있으며 다른 ROM, 장치 또는 SQLite 버전과 잘 작동하지 않습니다. 더 많은 장치가 ICS와 최신 버전의 SQLite를 얻을 때, 4.0 이전 장치에서 생성 된 이러한 오래된 백업은 복원 할 때 문제가 될 것입니다. 2.3.3+이 출시되고 더 많은 장치가 FROYO에서 옮겨 질 때까지 이런 예외는 보지 못했습니다. – ssuperz28

+0

Sqlite에서 트랜잭션을 사용하여 데이터가 모두 작성되었거나 전혀 작성되지 않았는지 확인하고 있습니까? –

0

Kingamajick의 답변에 한 가지 덧글을 추가합니다 (포럼에서 실제로 댓글에 추가 할 수는 없습니다). 파일을 단순히 복사하는 접근 방식에서 사용자가 DB를 복원하고 이미 데이터가있는 경우 덮어 씁니다. 예를 들어, 사용자가 새 전화기로 업그레이드하고 잠시 동안 사용한 다음 이전 전화기에서 DB를 복원하면 새 전화기에 이미있는 모든 데이터가 손실됩니다.이는 DB를 읽고 파일 (XML 또는 CSV 등)에 쓰는 것의 한 가지 장점입니다.

다른 질문 (Android sqlite backup/restore without overwriting)을 게시하여 누군가가이 문제를 피하는 더 나은 해결책을 찾고 있지만 지금까지는 문제가없는 것으로 보입니다. ssuperz28과 ssuperz28 사이에 DB를 백업하는 것이 훨씬 더 안전한 방법 인 것 같습니다. xml에 기록한 다음 다시 읽고 다시 복원에 추가하는 것입니다.

또한 https://stackoverflow.com/a/34477622/3108762은 내가 지금까지 본 다른 제안 중 최고이며 마쉬멜로 우에서 시작하는 더 좋은 방법을 약속합니다.