Конфликты базы данных между потоками - PullRequest
1 голос
/ 30 января 2012

Мое приложение анализирует три различных 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);
    }

Есть ли способ остановить их борьбу за базу данных?Должен ли я заблокировать базу данных, пока она не будет готова, а затем выпустить ее?Если это так, как это сделать?

1 Ответ

5 голосов
/ 30 января 2012

вы можете сделать метод addDBSplosna (SplosnaRazred s) синхронизированным , чтобы быть уверенным, что только один поток одновременно может записывать в БД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...