我在我的應用程序中創建了一個包含5個表的數據庫。我的數據庫正在從不同的線程更新。當我看到日誌時,如果數據庫已經打開,我可以看到有數據庫鎖定異常。數據庫鎖定異常
我的一個朋友建議我總是使用內容提供商,以避免此問題。據他說,內容提供者自己管理併發問題?
它是一個很好的做法,使用內容提供商,如果我們不希望將數據分享給其他應用程序?
我在我的應用程序中創建了一個包含5個表的數據庫。我的數據庫正在從不同的線程更新。當我看到日誌時,如果數據庫已經打開,我可以看到有數據庫鎖定異常。數據庫鎖定異常
我的一個朋友建議我總是使用內容提供商,以避免此問題。據他說,內容提供者自己管理併發問題?
它是一個很好的做法,使用內容提供商,如果我們不希望將數據分享給其他應用程序?
問題是,您使用多個數據庫連接到您的數據庫。因此,多個線程嘗試同時更新您的表,並且所有這些線程都與您的數據庫有不同的連接。
爲了避免所有的線程,你需要使用到數據庫相同的連接,這個問題也就是所有的線程應該使用到數據庫相同的連接(由SQLiteDabase對象表示)。
而且,這樣有一個源碼文件的文件塊,你會不會提高數據庫的性能,使用多個線程升級(最好是隻使用一個線程使用數據庫的工作)。如果你想使用多個線程,你應該使用與數據庫相同的連接,在這種情況下,Android將管理鎖。
這個問題,你可以在這裏找到的討論:http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking這裏:我想用讀寫鎖What are the best practices for SQLite on Android?
足以在大多數情況下。
假設你已經寫了下面,
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MyDatabase extends SQLiteOpenHelper
{
private static final ReadWriteLock rwLock = new ReentrantReadWriteLock(true);
private static void beginReadLock()
{
rwLock.readLock().lock();
}
private static void endReadLock()
{
rwLock.readLock().unlock();
}
private static void beginWriteLock()
{
rwLock.writeLock().lock();
}
private static void endWriteLock()
{
rwLock.writeLock().unlock();
}
那麼你可以做你的任務如下所示。
public static void doSomething()
{
SQLiteDatabase sldb = null;
try
{
beginReadLock();
MyDatabase mydb = new MyDatabase();
sldb = mldb.getReadableDatabase();
......
}
catch (Exception e)
{
......
}
finally
{
if (sldb != null)
{
try
{
sldb.close();
}
catch (Exception e) {}
}
endReadLock();
}
}
圍讀操作進行beginReadLock()和endReadLock()。同樣,附上寫操作與beginWriteLock()和endWriteLock()。
幾個月前,通過上述解決方案,我可以解決多個線程試圖讀/寫打開一個數據庫,同時我自己的數據庫鎖定問題。
Hey @Takahiko川崎:我試過你的解決方案,但我仍然面臨這個問題。不知道可能會出現什麼問題。 – Neha
應該在databaseHelper類的同一個對象上完成 – Kay