我读过很多话题,但我想不出问题的答案:有可能同时读和写吗?
我有后台线程,更新一些数据,UI需要存储在数据库中的一小部分数据.因此,在UI中执行线程 Select 操作.但它会在更新过程中阻塞.因此,UI冻结了几秒钟.
有没有人在写的时候能成功地从数据库中读取数据?
可以在iPhone上读写DB.造成这种差异的原因是在本地sqlite函数上同步实现包装器吗?
我读过很多话题,但我想不出问题的答案:有可能同时读和写吗?
我有后台线程,更新一些数据,UI需要存储在数据库中的一小部分数据.因此,在UI中执行线程 Select 操作.但它会在更新过程中阻塞.因此,UI冻结了几秒钟.
有没有人在写的时候能成功地从数据库中读取数据?
可以在iPhone上读写DB.造成这种差异的原因是在本地sqlite函数上同步实现包装器吗?
在Android 3.0及更高版本上,SQLiteDatabases支持WAL模式(预写日志(log)记录):
如果未启用预写日志(log)记录(默认设置),则不会启用
相反,启用预写日志(log)记录时,写入操作 发生在允许继续读取的单独日志(log)文件中 同时.当写入正在进行时,其他线程上的读取器 将感知写入之前的数据库状态 开始了.写入完成后,其他线程上的读取器将 感知数据库的新状态.
要在WAL模式下启动事务,请使用BeginTransactionNoneExclusive()而不是beginTransaction().
In simpler words: call beginTransactionNonExclusive() for IMMEDIATE mode and we can read while another thread is writing (the state before the write transaction started because we won't use read_uncommitted connections -> http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Dirty_reads).