我有一个程序的两个部分(实际应用程序和一个BroadcastReceiver),它可能尝试连接并修改SQLite数据库和SharedPreferences文件。
1)我知道您可以与单个SQLite数据库建立多个连接。我还读到SQLite在尝试修改或读取数据库(UPDATE,INSERT等)时可以“锁定”数据库,因此如何正确处理2个线程尝试修改/读取单个SQLite数据库的情况同时?
现在,我的数据库连接代码/类中有这段代码:
private SQLiteDatabase myDatabase;
public boolean insert(ContentValues columnValueMap) throws Exception
{
long result = 0;
int attempt =0;
do
{
if(!myDatabase.isDbLockedByOtherThreads() && !myDatabase.isDbLockedByCurrentThread())
{
synchronized (myDatabase)
{
result=myDatabase.insertOrThrow(TABLE_NAME, TEXT, columnValueMap);
if(result ==0 || result == -1)
{
return false;
}
return true;
}
}
else
{
Thread.sleep(50);
}
attempt++;
}while(attempt<=5);
throw new Exception("Database Locked!");
}
2)我是否还要担心SharedPreferences文件的同时访问(哪个线程首先获得访问权限并不重要,我只是担心会抛出错误)?
感谢。
[编辑] 建议的更改
public boolean insert(ContentValues columnValueMap) throws Exception
{
long result = 0;
synchronized (myDatabase)
{
result=myDatabase.insertOrThrow(TABLE_NAME, SMS_TEXT, columnValueMap);
if(result ==0 || result == -1)
{
return false;
}
return true;
}
}
答案 0 :(得分:4)
首先,数据库内置了锁定支持,默认情况下它已打开。如果您想要安全,请致电SQLiteOpenDatabase.setLockingEnabled(true)
。
对于对共享首选项的访问,我将在所有使用synchronized的小函数中封装对SharedPreferences(读和写)的所有访问。 (确保它们是原子的)。