在android中备份/恢复sqlite数据库

在android中备份/恢复sqlite数据库,android,sqlite,Android,Sqlite,可能重复: 我正在开发一个应用程序,其中有SQL lite db。我需要让用户能够备份数据库并再次恢复它。我该怎么做?示例代码 如果我的用户保存了数据库,然后将应用升级到新的数据库版本代码,会恢复工作吗?我该怎么做呢?你能澄清一下“备份”是什么意思吗?SQLite没有特定的备份方法;您必须从数据库中读取行并以某种方式保存它们。许多开发人员使用XML来实现这一点 如果用户保存了数据库,然后移动到新的数据库版本代码,则必须决定如何进行恢复。同样,您必须读取备份并将其放回数据库;SQLite和And

可能重复:

我正在开发一个应用程序,其中有SQL lite db。我需要让用户能够备份数据库并再次恢复它。我该怎么做?示例代码


如果我的用户保存了数据库,然后将应用升级到新的数据库版本代码,会恢复工作吗?我该怎么做呢?

你能澄清一下“备份”是什么意思吗?SQLite没有特定的备份方法;您必须从数据库中读取行并以某种方式保存它们。许多开发人员使用XML来实现这一点

如果用户保存了数据库,然后移动到新的数据库版本代码,则必须决定如何进行恢复。同样,您必须读取备份并将其放回数据库;SQLite和Android都不会为您这样做

包android.app.backup包含用于使用android备份代理的类,但它们实现了一个通用框架。由您为要备份的每个文件或数据库实施具体操作。

在文件夹“/data/data/'your.app.package'/databases/”中,您有一个.db文件作为您的数据库。您可以复制该文件,保存它,然后再将其放回原处

关于如何将数据库备份到外部存储器的一个示例:

    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();
final String inFileName=“/data/data//databases/foo.db”;
File dbFile=新文件(inFileName);
FileInputStream fis=新的FileInputStream(dbFile);
字符串outFileName=Environment.getExternalStorageDirectory()+“/database\u copy.db”;
//打开空数据库作为输出流
OutputStream output=新文件OutputStream(outFileName);
//将字节从输入文件传输到输出文件
字节[]缓冲区=新字节[1024];
整数长度;
而((长度=fis.read(缓冲区))>0){
输出.写入(缓冲区,0,长度);
}
//关闭溪流
output.flush();
output.close();
fis.close();

请看这篇文章“Android备份/还原:如何备份内部数据库?”[1]:@Ramkiran是否正常请告诉我。。我有同样的要求如何还原它?@omidomi:要还原数据库,只需将.db文件复制到/data/data//databases/foo.db即可。这是您的问题吗?在第1行中,我们可以使用以下内容,而不是硬编码db文件的路径:final String inFileName=context.getDatabasePath(“db_name”).getPath();这并不总是有效的。Sqlite创建wal(预写日志记录)文件,因此,您的.db文件可能已过时。真的吗?