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

时间:2010-07-13 01:06:15

标签: java android multithreading sqlite sharedpreferences

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

1 个答案:

答案 0 :(得分:4)

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

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