如何在Android 9(Pie)中备份数据库?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Android 9(Pie)中备份数据库?相关的知识,希望对你有一定的参考价值。

我有一个备份活动,用户可以备份应用数据库并稍后将其还原...为了备份,我只是将我的应用程序database.db文件复制到sdcard ...为了恢复,我首先删除database.db-shm和database.db-wal文件(如果存在)(因为android 9使用它们),然后用新的替换database.db。

恢复功能在所有android ver中都可以正常工作。备份功能也适用于所有android版本,但在android 9.0中不可靠!因为用户添加的一些新数据位于缓存文件(database.db-shm和database.db-wal)中,而不应用于数据库.db

我该怎么办?

我可以强制将缓存文件应用到database.db,然后备份它吗?

或...

答案

我自己回答...

通过此链接的帮助:Temporary Files Used By SQLite

即:“ WAL文件是在打开与数据库的第一个连接时创建的,通常在与数据库的最后一个连接关闭时会被删除。但是,如果最后一个连接没有彻底关闭,则WAL文件将保留在文件系统中,并且将下次打开数据库时自动清除。“

所以我在备份前就关闭数据库,备份后再打开它

protected void backupDB() throws IOException 
    SugarContext.terminate(); //Close databse
    String format = new SimpleDateFormat("_yyyyMMdd-HHmmss").format(new Date());
    FileInputStream indb = new FileInputStream(new File(new File(Environment.getDataDirectory() + File.separator + "//data//ir.shia.mohasebe//databases//"), "sugar_example.db"));
    File file = new File(Environment.getExternalStorageDirectory() + File.separator + "Mohasebe Amal");
    file.mkdirs();
    FileOutputStream outdb = new FileOutputStream(new File(file, "mohasebe_backup" + format + ".mbac"));
    FileChannel channel = indb.getChannel();
    FileChannel channel2 = outdb.getChannel();
    channel2.transferFrom(channel, 0, ((FileChannel) channel).size());
    channel.close();
    channel2.close();
    SugarContext.init(getApplicationContext()); //Open database again

以上是关于如何在Android 9(Pie)中备份数据库?的主要内容,如果未能解决你的问题,请参考以下文章

Android(9)Pie中如何允许所有网络连接类型HTTP和HTTPS?

FusedLocationProviderClient 在 Android Pie 9.0 中返回错误的纬度经度

Android Api(Okhttps)未在android 9(pie)及更高版本中调用[重复]

为啥 Android Studio 不会在 Android Pie (9.0) 上运行应用程序?

Android Pie 9.0 将用户带到通知中心

多进程中的 Android Pie (9.0) WebView