Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 应用程序覆盖后保存sqlite数据库_Android_Database_Sqlite_Restore - Fatal编程技术网

Android 应用程序覆盖后保存sqlite数据库

Android 应用程序覆盖后保存sqlite数据库,android,database,sqlite,restore,Android,Database,Sqlite,Restore,我的问题是,我想在覆盖设备上的同一个应用程序后恢复应用程序的sqlite数据库。我不喜欢在启动我的应用程序时一次又一次地添加设置 那么,在安卓系统中,是否有可能将数据库保存在某个地方,以便我再次恢复它 我在谷歌上搜索了几个小时,但找不到任何解决方案 编辑:它不是一个固定的数据库。所以我无法将其存储在资产文件夹中。它可以由用户编辑,但默认情况下,它应该携带最后编辑的值(应用程序覆盖之前的值)。我发现此方法非常有用: public static void movedb(File srcdb, Fil

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

那么,在安卓系统中,是否有可能将数据库保存在某个地方,以便我再次恢复它

我在谷歌上搜索了几个小时,但找不到任何解决方案


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

我发现此方法非常有用:

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(这个,新文件(.getDatabasePath(“…您的数据库名称…”)),新文件(“…您的位置…”);
要备份,然后恢复,请执行以下操作:

movedb(this, new File("... your location ..."), new File(<context>.getDatabasePath("...your DB name...")));
movedb(这个,新文件(“…您的位置…”),新文件(.getDatabasePath(“…您的数据库名称…”));

我正在使用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()
,而不是存储返回的实例,这将起作用。

问题不是很清楚。更新应用程序时不会删除数据库,因此我不明白您为什么需要在更新应用程序后从某个位置将其还原。如果您只是使用相同的密钥更新应用程序进行签名,那么数据库应该仍然存在,afaik。可能在覆盖onUpdate()后打开数据库时会清除数据库?-只是一个想法,可能是错误的…@Kuffs-我正在完全删除我的应用程序广告,然后再次安装..所以每次我都会丢失我的sqlite数据库..我需要恢复它。我看到的一些教程在每次安装应用程序时都会创建一个新的数据库。确保您的“创建数据库”方法不会这样做,否则,Kuffs将拥有您的answer@Martze-是的,你说得对。但我没有更新我的应用程序。我先完全删除它,然后覆盖它。这就是问题所在。但我想知道,如果我卸载我的应用程序,我将如何获得srcdb文件?我对此没有确切的想法。感谢您的回复。在卸载之前,您可以使用此代码复制数据库(在外部存储目录中的文件中)。然后,当你重新安装时,你可以恢复数据库。数据存储在SD卡上。对???@QuintinBalsdon创建备份时如何设置文件位置?因为我不知道我手机上的目录结构如何,所以该值是多少?文件位置是您知道的设备上存在的目录。您可以通过将Environment.getExternalStorageDirectory()打印到您的logcat来检查它上有哪些目录。