web-dev-qa-db-ja.com

Androidデータベースディスクイメージの取得が不正です(コード11)エラー

私のアプリケーションでは、このデータベースのディスクイメージが一部のユーザーにとって不正な形式(コード11)のエラーになっています。私はそれをグーグルで検索し、dbイメージの形式が正しくない場合Androidはそれを削除し、一部のユーザーに発生している新しいdbファイルを再作成することを知りました。

ここでの問題は、10人のユーザーのうちです。dbでこのエラーが発生するのは2〜3人のユーザーでのみ再作成され、logcatでエラーが発生する理由もわかりません。データベースが10ユーザーに対して不正な形式である場合、10ユーザーすべてに対して2〜3ユーザーのみのデータベースを再作成しないのはなぜですか?誰かがそれを処理する方法を正しい方向に向けることができますか?

更新:まだ問題を再現できませんが、いくつかのログを取得できました。

08-28 08:35:44.847 E/SQLiteLog(15123): (11) database corruption at 
line 65088 of [00bb9c9ce4]
08-28 08:35:44.847 E/SQLiteLog(15123): (11) statement aborts at 67      
08-28 08:35:44.857 E/DefaultDatabaseErrorHandler(15123): Corruption 
reported by sqlite on database: 
/data/data/com.retail.posmaster/databases/GrofersRetail
08-28 08:35:45.377 D/dalvikvm(15123): GC_EXPLICIT freed 2639K, 62% 
free 7479K/19228K, paused 4ms+8ms, total 82ms
08-28 08:35:45.727 E/DefaultDatabaseErrorHandler(15123): !@ Delete old 
.mark file
08-28 08:35:45.737 E/DefaultDatabaseErrorHandler(15123): !@ DB 
Corruption has happened before this
08-28 08:35:45.757 E/DefaultDatabaseErrorHandler(15123): !@ DB 
Corruption has happened before this
18
Pramod Yadav

多くのユーザーがこれに賛成票を投じているのを見てきたので、他の多くの人々が同じ問題に直面していると思います。これをさかのぼることはできませんでした。製品ロードマップとビジネスロジックが変更されたため、AndroidアプリケーションでDBを維持することをやめたため、組織では有効なユースケースではありません。私はそれが起こった理由を見つけるためにいくつかの調査を行いました、そして私はいくつかの洞察を持っています。したがって、DBサイズが非常に大きく、それをメモリにロードしようとしていて、十分なメモリがない場合、DBファイルが破損する可能性があります。もう1つの理由は、複数のDB接続を維持していて、前の接続を適切に閉じずに複数の接続からDBにアクセスしようとしていることです。単一の接続を維持し、コンテンツプロバイダーを使用するようにしてください。 Androidシステムの問題は、何らかの理由でDBファイルの形式が正しくないか破損している場合、例外やその他の方法でDBファイルを手動で処理できないことです。次回DBで操作を実行しようとして、DBファイルに接続しようとしたときに、ファイルが破損していることをシステムが検出すると、Androidシステムは新しいファイルを再作成します。データが失われます。これは、Androidシステムのデフォルトの動作です。したがって、アプリケーションでもこの問題に直面している場合は、DBファイルが破損している理由をデバッグしてみてください。これは、DBファイルが破損すると、この動作を停止するために何もできないためです。もう1つできることは、 Realm のような他のDBに移動することです。 SQLite DBでのみこれを経験したので、私はそれらの動作に気付いていないので、それを調べることができます。

2
Pramod Yadav