在Android平板电脑内存中保存SQLite数据库(API 23)

时间:2016-10-18 09:42:16

标签: android sqlite database-backups

我是Android应用程序开发中的新手。但是,我目前的项目要求我制作一个记录现场观察的应用程序(我是研究科学家),将它们保存到SQLite数据库 - 这些将被发送到中央位置进行处理。该应用将用于平板电脑。

目前,我正在使用Android Studio,当我模拟应用程序功能时,一切都按计划运行并使用DB Browser for SQLite,我可以看到值正在数据库中正确记录。

做研究(一个例子就是答案here),我知道数据库(.db)文件保存在目录路径中:

/data/data/<your.app.package>/databases/foo.db

当然,这可以在Android Studio中访问,但我的理解是,除非设备已植根,否则这些文件在实际设备中是不可访问的。由于各种原因,这不是我参与的工作的选择。

在研究中,我遇到了一种备份数据库的方法,并将备份数据库保存到SD卡,如问题Backup/restore sqlite db in android [duplicate]和重复目标Android backup/restore: how to backup an internal database?的答案。

在23及以上的API中保存到外部存储设备(如SD卡)现在需要相当多的权限才能写入外部源(超出Manifest中一直需要的权限)。由于许多原因,此选项不是最佳选择。

this answer中,备份保存在SD卡上:

final String inFileName = "/data/data/<your.app.package>/databases/foo.db";
File dbFile = new File(inFileName);
FileInputStream fis = new FileInputStream(dbFile);

String outFileName = Environment.getExternalStorageDirectory()+"/database_copy.db";

// Open the empty db as the output stream
OutputStream output = new FileOutputStream(outFileName);

// Transfer bytes from the inputfile to the outputfile
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer))>0){
    output.write(buffer, 0, length);
}

// Close the streams
output.flush();
output.close();
fis.close();

但是,我的问题(可能是脑屁类型)是 - 是否可以将备份保存到设备的内部文件(例如Documents文件夹),是否还需要权限?< /强>

1 个答案:

答案 0 :(得分:1)

实现疏漏流程并不复杂。我为帮助而创建的Here is a class。你必须从中扩展你的MainActivity,然后你可以调用:

verifyStoragePermissions(new Runnable() {
    @Override
    public void run() {
        //backup your db here...
    }
});

适用于所有使用Android支持库的Android版本。