在默认情况下 SQLite 的事务原子提交和回滚使用的是
rollback journal
模式。但是在 3.7.0 版本(Android 9.0)中 SQLite 引入了一种新的日志模式
Write-Ahead Log
(常简写为 WAL )。
一些app在android9.0使用数据库时出现错误可以看看是不是这里的问题。
默认的
rollback journal
模式工作原理大致为:写操作进行前进行数据库文件拷贝,然后对数据库进行写操作。如果发生 Crash 或者 rallback 则将日志中的原始内容回滚到数据库中进行恢复操作,否则在 Commit 完成时删除日志文件。
WAL 模式则采用了相反的做法。在进行数据库写操作时,它会先复制一份原始数据到日志文件中并且将写操作也更新到日志文件中而原有数据库内容则保存不变。如果事务失败,WAL 中的记录会被忽略;如果事务成功,它将在随后的某个时间被写回到数据库文件中二该步骤被称为
Checkpoint
。
在读的时候,SQLite 将在 WAL 文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行);随后,它确定所要读的数据所在页是否在 WAL 文件中,如果在,则读 WAL 文件中的数据,如果不在,则直接读数据库文件中的数据。
WAL性能
1.读和写可以完全地并发执行,不会互相阻塞(但是写之间仍然不能并发)。
2.WAL在大多数情况下,拥有更好的性能(因为无需每次写入时都要写两个文件)。
3.磁盘I/O行为更容易被预测。
1.访问数据库的所有程序必须在同一主机上,且支持共享内存技术。
2.每个数据库现在对应3个文件:<yourdb>.db,<yourdb>-wal,<yourdb>-shm。
3.当写入数据达到GB级的时候,数据库性能将下降。
4.3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。
WAL引入的兼容性问题
在启用了WAL之后,数据库文件格式的版本号由1升级到了2,因此,3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。
禁用WAL会使数据库文件格式的版本号恢复到1,从而可以被SQLite 3.7.0之前的版本识别。
如果对读写并发的要求低可以每次数据库打开时禁用WAL模式,即可完成app的版本兼容
在默认情况下 SQLite 的事务原子提交和回滚使用的是 rollback journal 模式。但是在 3.7.0 版本(Android 9.0)中 SQLite 引入了一种新的日志模式 Write-Ahead Log (常简写为 WAL )。一些app在android9.0使用数据库时出现错误可以看看是不是这里的问题。工作原理默认的 rollback journal 模式工作原理大...
一. 简介
SQLite
数据库
是一个轻量级的DBMS(
数据库
管理系统)。
SQLite
使用单个文件存储数据,
Android
标准库包含
SQLite
库以及配套使用的一些Java辅助类。主要特点:轻量级,单一文件,跨平台,开源。
二.
Android
中
SQLite
数据库
的使用
1、创建
SQLite
数据库
SQLite
Database db=
SQLite
Database.openOrCreateDatabase(
/data/data/ + getPackageName() + /test.db,
null);
执行完这条语句,可以在adb shell下进入/data/data/pac
2018年8月7日-凌晨1点,谷歌发布了
Android
9.0
操作系统,它的名字是
Android
9,被命名为
Android
Pie。让我们看看关于
Android
9派你需要知道的一切。
大纲如下:
Android
Pie 新特性有哪些?
官方Release Note更新说明
哪些设备第一时间将集成
Android
Pie?
Android
Pie 源码在哪里下载?
Android
Pie 新特...
一、什么是
WAL
?
WAL
的全称是Write Ahead Logging,它是很多
数据库
中用于实现原子事务的一种机制,
SQLite
在3.7.0版本引入了该特性。
二、
WAL
如何工作?
在引入
WAL
机制之前,
SQLite
使用rollback
journal
机制实现原子事务。
rollback
journal
机制的原理是:在修改
数据库
文件中的数据之前,先将修改所在分页中的数据备份在另...
Android
SQlite
-
journal
、-
wal
、-shm
在创建
数据库
时,不仅会生成xxx.db
数据库
文件,而且还会生成xxx.db-
journal
。这个-
journal
文件是用来干嘛的?其实这个文件是
sqlite
用来实现原子提交和回滚功能的。如果没有这个文件,
SQlite
将无法回滚未完成的事务,如果在事务中间发生崩溃或者掉电,那么整个
数据库
就有可能损坏。
-
journal
——回滚日志
wal
提供了更多的并发性,读时不会阻塞写,写时不会阻塞读;
使用
wal
使得磁盘IO操作更加连续;
wal
使用的fsync()操作要少得多,因此在fsync()系统调用中断的系统上,不太容易出现问题;
1.写在前面的话前面写过一篇关于
Sqlite
基本操作的文章,今天我们来学习
Android
中如何使用
Sqlite
以及性能优化。2.
Android
平台下
数据库
相关类
SQLite
OpenHelper 抽象类:通过从此类继承实现用户类,来提供
数据库
打开、关闭等操作函数。
SQLite
Database
数据库
访问类:执行对
数据库
的插入记录、查询记录等操作。
SQLite
Cursor 查询结构操作类:用来访
1、多线程下使用 rc =
sqlite
3_open_v2(DBFILENAME, &db,
SQLITE
_OPEN_READWRITE |
SQLITE
_OPEN_FULLMUTEX, NULL);
2、多线程开启
WAL
模式:rc =
sqlite
3_exec(db, "PRAGMA
journal
_mode=
WAL
;", callback, 0, &zErrMsg);
3、
WAL
要在
Android
Studio中连接
SQLite
数据库
,您需要执行以下步骤:
1. 在您的项目中创建一个
SQLite
数据库
。您可以使用
SQLite
OpenHelper类来创建和管理
数据库
。
2. 在您的项目中添加
SQLite
依赖项。您可以在build.gradle文件中添加以下代码:
dependencies {
implementation 'com.
android
.support:support-
sqlite
:28..'
3. 在您的代码中打开
数据库
连接。您可以使用以下代码:
SQLite
Database db =
SQLite
Database.openDatabase("path/to/database", null,
SQLite
Database.OPEN_READWRITE);
4. 执行SQL查询。您可以使用以下代码:
Cursor cursor = db.rawQuery("SELECT * FROM my_table", null);
这些步骤将帮助您在
Android
Studio中连接
SQLite
数据库
。