我在我的应用程序中创建了一个包含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