2016-07-27 42 views
0

我正在使用android SQLiteOpenHelper來處理我的sqlite數據庫。多線程多個sqlite命令android error

我想在後臺使用一個簡單的asynctask做大量的數據庫命令,所以用戶不會注意到它會給主線程帶來的延遲。 當有多個(很大數量)的命令我總是得到數據庫不能打開錯誤。

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) os_unix.c:31278: (24) open(/data/user/0/com.locomain.app/databases/app.db-journal) 

這不會發生,當我調用命令少量次。

我已經檢查了關於這個問題的其他線程,也做了一些谷歌搜索,但我無法找到anwser。

我的代碼:

public void addTag(Tag tag){ 
    final SQLiteDatabase db = getWritableDatabase(); 
    final ContentValues values = new ContentValues(1); 
    db.beginTransaction(); 

    values.put(TagColumn.TAG_NAME,tag.getName()); 

    db.insert(TagColumn.TABLE_NAME,null,values); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 
+0

其他的東西已經打開了文件。你有2個輔助類的實例嗎?它通常被認爲是最好的,使這個類是一個單身人士,以防止這個問題。 –

+0

不,它的單身 – locomain

回答

-1

讓你的方法,其使用DB​​。

嘗試使用線程而不是AsyncTasks,無論如何它更好用。

您確定要使用交易嗎?它確實減慢了你的插入。

+0

我讓SQLiteOpenHelper本身同步。但android的指導方針表明,應該使用asynctask線程對嗎?什麼是做這個原始查詢的更快的方法? – locomain

+0

問題在於AsyncTask對封閉Activity有一個隱式引用。如果發生配置更改,則啓動AsyncTask的Activity實例將被銷燬,但在AsyncTask完成之前不會被GCd。線程不會讓它更快。我沒有看到使用AsyncTask而不是線程的優勢,它們是相似的,但線程更穩定。 – DEADMC