2016-11-19 67 views
0

我目前正在爲我的項目開發一個android應用程序。同時訪問多個線程的SQLitedatabase

我的項目旨在使用Handler post delayed在背景上運行多個倒數計時器(不超過50次)。 在每一秒鐘,我必須查詢我的表,以更新某些特定的列。

我的查詢包裝爲try catch,我正在關閉數據庫finally。 這種方法適用於單線程,但一旦它成爲多個線程,它會給我一個類似the database is already close but morethan one thread is trying to access it的錯誤。

所以我想出了一個主意,除非整個應用程序關閉,否則不要關閉數據庫。

所以我的問題是,我應該做我在想什麼?或者有更好的方法呢?

+0

您正在關閉數據庫。仔細檢查您複製粘貼的代碼 – Chisko

+1

試試這種方法:http://stackoverflow.com/questions/35358186/best-way-to-access-database-in-multi-threaded-application-android –

+0

@Chisko - 我'對不起,如果我讓你對我的問題有所誤解,請清楚地閱讀這個問題。我說'我最後關閉了數據庫'(我知道我在做什麼以及我在哪裏關閉數據庫,並且我也知道錯誤/問題在哪裏),並且由於它正在通過多個線程訪問,它會給出一個錯誤。請閱讀我寫的最後一行。 – Polar

回答

0

the official docs

SQLiteOpenHelper (Context context, 
       String name, 
       SQLiteDatabase.CursorFactory factory, 
       int version) 

創建一個輔助對象創建,打開,和/或管理數據庫。這種方法總是很快返回。在調用getWritableDatabase()或getReadableDatabase()之一之前,數據庫實際上並未創建或打​​開。

和:

void close() 

關閉所有打開的數據庫對象。

因此,您可能會明白,獲取SQLiteOpenHelper的實例與具有對數據庫的訪問權限的對象不同。您需要管理您希望創建的所有線程的單例實例,以及分別致電getWritableDatabase()getReadableDatabase()的電話。

編輯

而且,它也是在Official SQLite Documentation指出,爲了在多線程應用程序中使用有額外的設置工作要做。我不認爲我必須說Android不是專爲多線程環境而設計的,請參閱this answer please。你爲什麼推動障礙?堅持太好的做法。做進一步的研究。谷歌第一。