2012-01-29 12 views
1

私のアプリケーションは3つの異なるXMLを解析し、それらをデータベースに保存します。 AsyncTaskを使用していて、進捗ダイアログが表示されていれば、すべてが順番に実行されたので、うまくいきました。私は今3つの異なるスレッド(+ UIスレッド)で同時にそのデータを解析し始めています。現在、これらの4つのスレッドはデータベース用に戦いますが、UIスレッドが使用されている場合は常にクラッシュすることがあります。その後、私はスレッド間のデータベースの競合

INFO/System.out(667): XML Pasing5 Excpetion = java.lang.IllegalStateException: database not open 

またはこの1

01-30 00:56:05.232: ERROR/AndroidRuntime(731): FATAL EXCEPTION: Thread-11 
01-30 00:56:05.232: ERROR/AndroidRuntime(731): java.lang.IllegalStateException: database not open 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1493) 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410) 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at edu.database.DBAdapter.insertSamodejne(DBAdapter.java:229) 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at edu.util.ApplicationInt.addDBSamodejne(ApplicationInt.java:49) 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at edu.xml.XMLtoDB.insertSamodejne(XMLtoDB.java:58) 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at edu.activity.SplashScreen$4.run(SplashScreen.java:97) 
01-30 00:56:05.232: ERROR/AndroidRuntime(731):  at java.lang.Thread.run(Thread.java:1096) 

を取得し、別の時間が、私はこれを使用して、約80項目に私はデータを挿入するたびに挿入

ERROR/AndroidRuntime(651): Caused by: java.lang.IllegalStateException: database /data/data/edu.activity/databases/vreme already closed 

と類似した:私は、次のエラーを取得します方法:

public void addDBSplosna(SplosnaRazred s) { 
     db.open(); 
     db.insertSplosna(s); 
     db.close(); 
} 

DBAdapter:

public long insertSplosna(SplosnaRazred splosna) { 
     ContentValues initialValues = new ContentValues(); 

     initialValues.put(VREMENSKA, splosna.getVremenska()); 
     initialValues.put(OBETI, splosna.getObeti()); 
     initialValues.put(UPDATED, splosna.getServerUpdated()); 

     return db.insert(TABLE_SPLOS, null, initialValues); 
    } 

データベースとの戦いを防ぐ方法はありますか?完了するまでデータベースをロックしてから解放する必要がありますか?それが事実なら、それをどうやって行うのですか?

答えて

5

addDBSplosna(SplosnaRazred s)synchronizedメソッドを作成して、その時点で1つのスレッドしかDBに書き込めないことを確認できます。

+0

これは金です!とてもシンプルで、そのような厄介な問題を解決します!ありがとう –