Android系统上解决SQLite数据库在断电时候丢失数据的问题

Android系统上使用SQLite数据库存储数据,结果发现,如果刚刚写入数据之后在很短的时间之内,如果立即断电会丢失刚刚写入的数据。

根据Google官方的文档,发现,从API-16开始,提供了enableWriteAheadLogging这个API来要求SQLite先写日志,后写数据库。这个行为才是常规数据库默认的行为。

一般Android设备使用的存储设备都是Flash闪存,是有写入寿命以及空间限制的,因此默认不启用日志功能,也是迫不得已,更何况数据库日志属于只增不减的,这就导致长时间运行后,会出现空间无法释放的问题。

还有一个解决方法就是,插入以及修改数据的时候,启用SQLite的事务模型,由于事务一定要保证数据已经同步到磁盘了,因此,可以避免出现断电后数据由于没有刷新到磁盘导致的数据丢失。

db.beginTransaction();
try {
	...
	db.setTransactionSuccessful();
} finally {
	db.endTransaction();
}

很多时候,会发现直接通过Kill,杀掉进程,一般是不会丢失数据的,原因在于磁盘写入的时候,系统会进行缓存,等合并到一定的量或者时间,系统一次性同步到磁盘,这样可以大大提供系统的性能。因此进程虽然已经死掉了,但是系统还是会把已经提交到内核的数据刷新到磁盘的,因此表现就是数据不会丢失。但是如果是断电的话,系统也就无能为力了。于是表现就是,越是新的Linux内核版本,反倒越是在异常断电的时候容易丢失数据。

参考链接


SQLiteOpenHelper

发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注