0

我的问题是我想在我的设备上覆盖同一个应用程序后恢复我的应用程序的 sqlite 数据库。我不喜欢在我的应用程序启动时一次又一次地添加设置。

那么在android中是否可以将数据库保存在我可以再次恢复它的地方?

我在 Google 和 SO 上搜索了超过几个小时,但找不到任何解决方案。

编辑:它不是一个固定的数据库。所以我不能将它存储在资产文件夹中。它可由用户编辑,但默认情况下它应该带有最后编辑的值(应用程序覆盖之前的值)。

4

2 回答 2

1

这个方法我觉得很有帮助:

public static void movedb(File srcdb, File destdb)
{
    try 
    {
        if (Environment.getExternalStorageDirectory().canWrite()) 
        {                 
            if (srcdb.exists()) 
            {
                FileChannel src = new FileInputStream(srcdb).getChannel();
                FileChannel dst = new FileOutputStream(destdb).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();                    
            }
            else
            {
                //ERROR: "Database file references are incorrect"                    
            }
        }
        else
        {
            //ERROR: "Cannot write to file"
        }
    }
    catch (Exception e) 
    {
        //ERROR: e.getMessage()
    }
}

然后我就打电话

movedb(this, new File(<context>.getDatabasePath("...your DB name...")), new File("... your location ..."));

备份,然后恢复:

movedb(this, new File("... your location ..."), new File(<context>.getDatabasePath("...your DB name...")));
于 2012-07-30T13:02:57.123 回答
0

我正在使用 ORMLite,除了将数据库存储在外部公共目录中之外,在将文件恢复到数据库目录后,我必须重新实例化DatabaseHelper单例并创建一个新的。

这是我的版本,为了简单起见,省略了每个 try/catch 块:

public boolean restoreBackup(Context context){

    String databasePath = "data/data/my.package.name/databases/myDatabase.sqlite";
    String backUpPath = context.getDatabaseDir("myDatabase.sqlite");

    // Copies back-up to database directory
    new File(databasePath).delete();
    FileInputStream streemToBackUp = new FileInputStream(new File(backUpPath));
    OutputStream streamToDatabaseFile = new FileOutputStream(databasePath);

    byte[] buffer = new byte[1024];
    int length;
    while ((length = streamToBackUp.read(buffer)) > 0) {
        streamToDatabaseFile.write(buffer, 0, length);
    }
    streamToDatabaseFile.flush();
    streamToDatabaseFile.close();
    streamToBackUp.close();

    // Re-instantiate DatabasHelper singleton
    DatabaseHelper.closeHelper();
}

的正文closeHelper()如下:

public static void closeHelper() {
    helper.close();
}

@Override
public void close() {
    super.close();
    myDao = null; // Set to null every day you have
    helper = null; // Set to null the singleton instance of the helper
}

只要您不使用OpenHelperManager类来实例化帮助程序,这将起作用,并且总是getHelper()在您需要数据库而不是存储返回的实例时使用。

于 2016-07-28T23:42:20.043 回答