【アドバイスください】SQLiteDatabaseCorruptExceptionについて

1,610 views
Skip to first unread message

micco

unread,
Sep 6, 2012, 11:42:30 AM9/6/12
to android-g...@googlegroups.com
こんばんは。
miccoです。
 
SQLiteを使ったアプリですが、稀にユーザから「データが消えた」という申告を頂くことがあります。
手元の端末では再現したことがありませんが、エラーレポートを見てみると「SQLiteDatabaseCorruptException」というエラーがありました。
これはデータベースが壊れた場合に投げられる例外のようですので、実際に何らかの理由でデータベースファイルが壊れることがあるようです。
しかし、この事象が発生する原因もよく分かっておらず、どのような対策が必要なのか見当もついておりません。
手動バックアップ機能は実装していますので、SDカードにファイルをバックアップして頂ければ良いと思いますが、根本的な解決を試みたいと思っております。
同様の経験をお持ちの方もいらっしゃるかと思いますので、何らかアドバイスを頂けたら幸いです。
宜しくお願いいたします。

micco

unread,
Sep 9, 2012, 3:06:55 AM9/9/12
to android-g...@googlegroups.com
こんにちは。
miccoです。
 
コメントありがとうございます!
そうですね、自動バックアップの実装も検討しています。
 
さらにネットを色々探していると、複数スレッドから同時にデータベースファイルへinsert等を実行するとSQLiteでは壊れるというような記事を見かけました。
こんなことで壊れないような仕様にして欲しいものですが。。。
 
意図的に複数スレッドで同時にDB処理を行っているような実装は無いのですが、たまたま何らか特別な要因で意図していない処理が生じたのかもしれません。
よく分かりませんが、これが原因であれば、DB処理をまとめたクラス内のメソッドをsynchronized修飾子で同期処理させれば良いのではないかと思っています。
ただ、何ら確証が持てていないため、どなたかノウハウをシェアして頂けたら幸いです。
 
以上、宜しくお願いいたします。
 
 

2012年9月9日日曜日 4時47分25秒 UTC+9 ky jp:
こんばんは

自分の作ってるアプリでも同様の不具合が偶に発生するようでして、最初に報告されたのが1年ほど前で、今現在も悩んでいます。
何が原因なのか分かりませんが、ユーザーの報告ではT-01CやXperiaX10、IS03などで発生しているようです。
Galaxy系のユーザーからは報告されたことがありません(ちゃんと調べてませんが多分なかったと思います)

根本的解決にはなりませんが、自動バックアップを実装されては如何でしょうか。
よろしくお願いいたします。

2012年9月7日金曜日 0時42分30秒 UTC+9 micco:

micco

unread,
Sep 9, 2012, 3:51:20 AM9/9/12
to android-g...@googlegroups.com
こんにちは。
miccoです。
 
書き忘れましたが、SQLiteデータベースを処理するクラスのsingletonパターンへの変更も必要ではないかと思っています。
各Activity毎に当該クラスのインスタンスを生成していますので、単一インスタンスによる複数スレッドからのinsert処理だけでなく、
バックグラウンドのActivityとフォアグランドのActivityで同時に別インスタンスでDB処理してしまうようなことが発生している可能性
もありそうですので。。。
 
したがいまして、
 
DB処理クラスの「singletonパターン化」&「synchronizedメソッド化」
 
という解決方法を考えています。
 
ご教示の程宜しくお願いいたします。
 

2012年9月9日日曜日 16時06分56秒 UTC+9 micco:

Shigeo Mutoh

unread,
Sep 10, 2012, 9:29:10 AM9/10/12
to android-g...@googlegroups.com
tmhouseこと武藤です。

自分ならどうするかなあと思って考えてみたのですが、もしも
DBアクセスの処理が軽いのであれば、すべてmainスレッドで処理
するように工夫するのも手だと思います。
ユーザースレッドからアクセスする必要があるなら駄目ですが。

もしも多数のユーザースレッドからDBアクセスが必要なら、いっそ
Serviceにキューイングする手もあると思います。Serviceが複数起動
するような間違いさえしなければ。
Serviceへ処理をまわす(startServiceでしたか)と、たしか自動的に
キューイングされ順次onStartが呼ばれたような気がするのですが
そこらへんはお調べください。

最後にsingleton化と排他制御ですが、それで原理的には解決
するとは思うものの、様々な面で非常に神経質になるのが嫌です。
本当にsingletonオブジェクトを触っているのか、本当に排他制御
できているのか、デッドロックしないのか、全部神経質な問題です。
それに、もしもこの方法でもまだ問題が再現するとき、結構泣けます。
それでもやむを得ずこの方法を取る場合もあると思います。

以上です。

micco

unread,
Sep 15, 2012, 3:02:22 AM9/15/12
to android-g...@googlegroups.com
こんにちは。
miccoです。
 
武藤さん、ご意見ありがとうございます。
ご返信が滞って申し訳ありません。
 
複数スレッドで処理する必要はありませんので、すべてmainスレッドで
処理しているつもりですが、DBファイルが壊れるという事象が発生した
模様です。
 
自分の端末では再現したことがないため、どういう操作を行ったときに
壊れたか詳細が分かっておりません。。。
 
singleton化と排他制御を行うよりも、オートバックアップ機能を実装す
る方が前向きな気がしてきました。
 

2012年9月10日月曜日 22時29分29秒 UTC+9 TM:
Reply all
Reply to author
Forward
0 new messages