2012-01-29 7 views
1

Мое приложение анализирует три разных XML и сохраняет их в базе данных. Он работал нормально, пока я использовал AsyncTask, с диалогом прогресса, потому что все они выполнялись один за другим. Теперь я начинаю анализировать эти данные одновременно в трех разных потоках (+ поток пользовательского интерфейса). Теперь эти четыре потока борются за базу данных и иногда сбой, всегда, если используется поток пользовательского интерфейса. Я получаю следующие ошибки:Конфликты между файлами

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

потом еще раз я получаю

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

или это один

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 пунктов каждый раз, когда я вставить данные, используя это и другие подобные методы:

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, чтобы быть уверенным, что только один поток в то время может записать в БД.

+0

Это золото! Так просто и решает такую ​​досадную проблему! благодаря –

Смежные вопросы