导出可写的sqlite数据库

时间:2018-10-11 16:30:52

标签: java android sqlite android-sqlite

是否可以导出可写数据库?我需要使用从手机的Visual Studio应用程序中导出的数据库作为系统的一部分。我知道这很糟糕,但这是我唯一可以完成我的项目的方法。这是我用来从SQLiteImporterExporter库导出数据库的代码

public void exportDataBase(String path) {
    InputStream myInput = null;
    OutputStream myOutput = null;
    try {
        String inFileName = DB_PATH + DB_NAME;
        myInput = new FileInputStream(inFileName);
        String outFileName = path + DB_NAME;
        myOutput = new FileOutputStream(outFileName);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
        if (exportListener != null)
            exportListener.onSuccess("Successfully Exported");
    } catch (Exception e) {
        if (exportListener != null)
            exportListener.onFailure(e);
    } finally {
        try {
            // Close the streams
            myOutput.flush();
            myOutput.close();
            myInput.close();
        } catch (Exception ex) {
            if (exportListener != null)
                exportListener.onFailure(ex);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

是否可以导出可写数据库?

在您的代码中,假设它正在工作,那么这就是您正在做的。还假定您要确保该数据库不在其他地方使用,并且已经关闭。

也就是说,SQLite数据库是一个文件,复制该文件,然后您可以在拥有SQLite的任何地方使用该数据库。可写/可读概念(即getWritableDatabase v getReadableDatabase)是较常见的误解之一。在大多数情况下,后者将获得可写数据库,如果该数据库也无法写入,则仅返回只读数据库。 (完整磁盘)。按照:-

  

创建和/或打开数据库。这将是返回的相同对象   通过getWritableDatabase()进行操作,除非出现某些问题,例如磁盘已满,   要求数据库以只读方式打开。在这种情况下,   将返回只读数据库对象。如果问题已解决,则   将来对getWritableDatabase()的调用可能会成功,在这种情况下,   只读数据库对象将关闭,而读/写对象   将来会退回。

getReadableDatabase

例外情况/考虑因素是:-

  • 如果数据库是加密的,则在这种情况下,您将使用加密代码/扩展名和密钥。
  • 在这种情况下,如果使用内存/临时表,并且如果需要这些内存/临时表,则可以创建一个副本数据库,但将内存/临时表更改为永久表。

    • SQLite确实具有一个备份API。但是,我不相信Android中的SQLite API会实现备份API(因此尝试使用它比实现copy方法可能要痛苦得多)。
  • 在Android上,数据库中将有一个名为 android_metadata 的附加表,该表仅存储区域设置,可以在其他地方忽略。