Android – SQLite + SharedPreferences,2个线程同时读/写?

我有一个程序的两个部分(实际的应用程序和一个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; } } 

首先,数据库内置了锁定支持,默认情况下它已打开。 如果您想要安全,请调用SQLiteOpenDatabase.setLockingEnabled(true)

至于对共享首选项的访问,我将在所有使用synchronized的小函数中封装对SharedPreferences(读和写)的所有访问。 (确保它们是primefaces的)。