Android
系统上使用SQLite
数据库存储数据,结果发现,如果刚刚写入数据之后在很短的时间之内,如果立即断电会丢失刚刚写入的数据。
根据Google
官方的文档,发现,从API-16
开始,提供了enableWriteAheadLogging
这个API
来要求SQLite
先写日志,后写数据库。这个行为才是常规数据库默认的行为。
一般Android
设备使用的存储设备都是Flash
闪存,是有写入寿命以及空间限制的,因此默认不启用日志功能,也是迫不得已,更何况数据库日志属于只增不减的,这就导致长时间运行后,会出现空间无法释放的问题。
还有一个解决方法就是,插入以及修改数据的时候,启用SQLite
的事务模型,由于事务一定要保证数据已经同步到磁盘了,因此,可以避免出现断电后数据由于没有刷新到磁盘导致的数据丢失。
1 2 3 4 5 6 7 |
db.beginTransaction(); try { ... db.setTransactionSuccessful(); } finally { db.endTransaction(); } |
很多时候,会发现直接通过Kill
,杀掉进程,一般是不会丢失数据的,原因在于磁盘写入的时候,系统会进行缓存,等合并到一定的量或者时间,系统一次性同步到磁盘,这样可以大大提供系统的性能。因此进程虽然已经死掉了,但是系统还是会把已经提交到内核的数据刷新到磁盘的,因此表现就是数据不会丢失。但是如果是断电的话,系统也就无能为力了。于是表现就是,越是新的Linux
内核版本,反倒越是在异常断电的时候容易丢失数据。