在Android中使用数据库存储数据,查询时已经能查到,设备掉电关机再打开,发现已经存上的数据丢了一部分,现在怀疑是sqlite执行再闪存中,未来得及同步到磁盘,掉电导致数据丢失。
解决方案,将数据库同步模式改为全量同步。litepal未提供这个配置,在初始化之后直接调用sql语句也能实现。
LitePal.initialize(this)
//更改同步模式,避免掉电数据丢失
LitePal.getDatabase().execSQL("PRAGMA synchronous = FULL;")
存储的文件即使在文件管理器里已经能看到,突然掉电也可能丢失,可以用下边的方式手动同步。
try {
//已经写入数据的文件,例如照相返回的文件。
val file = File(path)
//关键
//同步文件到磁盘,true,追加模式,避免重新创建这个文件导致文件是0kb
val fos = FileOutputStream(file, true)
fos.fd.sync()
fos.close()
//如果是要创建新文件,直接用fos写入数据,不需要追加模式了。
} catch (e: Exception) {
e.printStackTrace()
}