线程之间的数据库冲突

Boj*_*goj 1 sqlite multithreading android

我的应用程序解析三种不同的XML并将它们保存到数据库中.只要我使用AsyncTask和进度对话框就可以正常工作,因为所有这些都是一个接一个地执行的.我现在开始在三个不同的线程(+ UI线程)中同时解析该数据.现在这四个线程争夺数据库,有时崩溃,总是在使用UI线程时.我收到以下错误:

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

然后我又来了

 INFO/System.out(667): XML Pasing5 Excpetion = java.lang.IllegalStateException: database not open
Run Code Online (Sandbox Code Playgroud)

或者这个

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)
Run Code Online (Sandbox Code Playgroud)

我每次插入数据时都会插入大约80个项目,使用此方法和类似方法:

public void addDBSplosna(SplosnaRazred s) {
      db.open();
      db.insertSplosna(s);
      db.close();  
}
Run Code Online (Sandbox Code Playgroud)

将对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);
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止他们争夺数据库?我应该锁定数据库直到它完成然后释放它吗?如果是这样的话,该怎么做?

sav*_*nok 5

你可以使方法addDBSplosna(SplosnaRazred s)同步,以确保当时只有一个线程可以写入DB.