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