2011-11-10 2 views
1

사용자가 앱 SQLite 데이터베이스 파일을 SD 카드에 저장할 수있는 앱이 있습니다. 이 함수는 1 년 넘게 사용되어 잘 작동했습니다. 내가 재현 할 수없는 오류가있는 경우 사용자가 데이터베이스 파일을 전자 메일로 보내도록했습니다.Android 데이터베이스 파일 손상

최근에 사용자가 데이터베이스 파일을 보내고이를 내 앱에로드하려고 시도했을 때 (앱의 데이터베이스 파일 위치에 배치) 데이터베이스 파일을 열려고 할 때 앱이 다운되었습니다. 이 사용자는 이전에 문제없이 파일을 보냈습니다.

내 앱의 유일한 차이점은 다음과 같습니다. 1) app-2-SD 기능을 추가했습니다. 2) 이제 내 앱 타겟 2.2가 1.6이었던 반면 1.6이었습니다.하지만 두 경우 모두 1.5는 최소 SDK 버전입니다.).

사용자가 SD 카드에 앱을 놓은 다음 앱이 다운되기 시작했다고합니다. 오류 보고서를 제출할 수있는 옵션도 제공하지 않습니다. 내가 에뮬레이터에서 자신의 파일을 배치

, 나는 다음과 같은 스택 추적을 가지고 : 그는 전에 나에게 데이터를 이메일, 그리고 파일이 올바른 데이터베이스 이름과 확장자를 가지고 있었다, 그래서 나는주는거야

11-09 22:32:04.275: ERROR/AndroidRuntime(757): Caused by: android.database.sqlite.SQLiteException: file is encrypted or is not a database 
11-09 22:32:04.275: ERROR/AndroidRuntime(757):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 
11-09 22:32:04.275: ERROR/AndroidRuntime(757):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1636) 
11-09 22:32:04.275: ERROR/AndroidRuntime(757):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1586) 
11-09 22:32:04.275: ERROR/AndroidRuntime(757):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638) 
11-09 22:32:04.275: ERROR/AndroidRuntime(757):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168) 

그에게 의심의 여지가 있고 잘못된 파일을 보낸 것으로 가정하지 마십시오. 누구든지이 문제를 전에 보았으며 가능한 원인이나 해결책을 알고 있습니까?

업데이트 어떤 차이가있는 경우 사용자로부터 휴대 전화가 HTC Evo 4G임을 알게되었습니다. 나는 최근의 안드로이드 릴리스에서 암호화 된 데이터베이스 파일에 대해 어딘가 읽었을 것으로 생각했다. 데이터베이스 파일은/data/data /보다/data/secure/아래에 저장된다 ... 이것이 관련 될 수 있는지 궁금하다. 어쨌든, 사용자에게 더 심문 한 후에, 적어도 그것이 문제가있는 데이터베이스 파일의 하나의 특정 테이블이라는 것을 알고 있습니다. 내 애플 리케이션의 다른 부분은 데이터베이스 파일 내의 다른 테이블과 상호 작용합니다. 응용 프로그램이 잘 작동하고 다른 테이블에 액세스 할 때 데이터를 저장/읽을 수 있지만 특정 테이블 하나에 액세스 할 때 파일을 열려고하면 오류가 발생합니다. 나는 그것이 발생하면이 예외를 잡는 추악한 수정을 추가 할 수 있다고 생각하고 손상된 테이블을 삭제 한 다음 다시 작성하십시오. 생각?

+0

좋아, SQLite 도구를 사용하여이 파일을 검사 할 수 있습니까? SQLite 도구에서이 데이터베이스 파일을 열어보십시오. 올바른 데이터가 표시되는지 확인하십시오. – user370305

+0

그게 제가 처음 시도한 것입니다. SQLite에서 파일을 열었을 때 아무 것도 없었습니다. 그것은 내 테이블을 보여주지 못했습니다.파일이 0 바이트가 아니더라도 파일에 아무것도 없습니다. – Michael

+0

@Michael 나는 또한 이런 문제를 겪었다. 해결책을 찾았습니까? 내 질문은 http://stackoverflow.com/questions/10210503/database-disk-image-is-malformed-or-file-is-encrypted-or-is-not-a-database입니다. – Judy

답변

0

또한 (다소 작은) db가 포함 된 응용 프로그램이 있으며 최근에 재현 할 수없는 db 문제로 인해 충돌 보고서가 생성됩니다.

내 앱으로 놀고 실제로 밀어 붙이면 결국 충돌이 발생합니다.

내 경우에는 그 이유

는 인해 many fast opening/closing/update requests, interruption of the app, language changes during the app, etc so the system somehow corrupted the db.

지금 구현 된 솔루션은 내가 당신 같은 생각 같은 충돌 보고서를하지 않았다

a. close/reopen the db often to avoid problems 

b. have a consistency-check routine for every save or retrieve of data now - lots of overhead - but that cleared it fo me so far... 

PS는 것이 었습니다. 필자는 지금 테스트를 위해 책상 위에 여러 개의 다른 안드로이드 폰을 가지고 있으며, 최신형 하이 엔드 전화기로 충돌하는 경우는 거의 없습니다. 이러한 문제는 빠른 하이 엔드보다 CPU/메모리 속도가 느린 경우 더 자주 발생합니다. -하지만 솔직히 나는 이것에 대해 아직도 혼란스러워하고 있습니다! 아마도 SD 카드 사용은 그와 관련이 있습니다.

+0

감사합니다. 나는 접근을 필요로 할 때마다 데이터베이스를 닫거나 다시 열지 만 일관성 검사를하지는 않습니다. 나는 그것을 조사 할 필요가있다. 수표는 어떻게 세웠습니까? try/catch 블록의 줄을 따라 데이터베이스 열기/저장 문을 둘러보고 예외가 잡히면 사용자에게 문제를 경고합니다. 아니면 더 깊은 무엇인가? – Michael

+0

나는 무결성 검사와 함께 try-catch를 사용하여 유효하지 않은 데이터가 없는지 확인합니다. 내가 침략 된 데이터를 찾은 경우 잘못된 값을 대체하기 위해 특정 기본값을 사용합니다. 내 경우에는 가능하며 사용자에게 알릴 필요가 없습니다. 그는 일부 저장된 값이 손실된다는 사실에 놀랄 것입니다. 그러나 용서받을 수는 있습니다. 그런데 모든 활동에서이 코드를 똑같이 복제해야만 이러한 경우에 쉽게 대응할 수 있습니다. 그러나 이것이 최선의 접근 방식은 아닙니다. 행운을 빌어 요 - 다시는 아무도 이것이 해결책인지 실제로 알지 못합니다. 운수 나쁘게 – user387184