Android卸载应用程序后保留数据库

时间:2014-02-25 11:17:17

标签: android sqlite sharedpreferences

我正在使用sq-lite数据库,我可以在三星设备中找到问题。当我卸载应用程序安卓操作系统保留数据库导致数据库版本冲突 - 以前我使用版本2,现在我使用版本1作为sqllitehelper构造函数中的参数。按照惯例,当卸载app时,Android OS会删除所有数据库,共享首选项和缓存文件。

我在app文件夹中使用了数据库存储的默认位置。

这是我得到的错误:

Caused by: android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1

5 个答案:

答案 0 :(得分:1)

我在三星S8上遇到了同样的问题 - 显然在三星Android设备上,应用程序内存在删除应用程序时不会自动删除。因此,当安装新的应用程序版本时,旧数据库仍然存在,并且如果数据库架构发生更改但数据库的版本号保持不变或甚至减少,则存在冲突。

解决方案:要安全删除数据库,您必须在系统设置的应用区域中打开受影响的应用的详细视图。在这里,您可以显式删除数据(以及数据库)并清空缓存。之后,您可以删除该应用程序。 下次在Samsung设备上安装应用程序时,将新创建数据库。

答案 1 :(得分:0)

SQlite数据库只是文件,它们被视为任何其他文件:它们(默认情况下)存储在应用程序的私有数据区(/ data / data / $ PACKAGENAME / databases)中。它们与应用程序私有数据区中的所有其他内容一起被删除。

如果您愿意,可以在SD卡上创建数据库。当然,它们在卸载时不会被删除。

答案 2 :(得分:0)

您可以使用以下方法在SDCard上备份数据库:

public void writeToSDCard() throws IOException {
    File f=new File("/data/data/com.YourPackage/databases/YourDB");
    FileInputStream fis=null;
    FileOutputStream fos=null;
    try{
        fis=new FileInputStream(f);
        fos=new FileOutputStream("/mnt/sdcard/backup.db");
        while(true){
            int i=fis.read();
            if(i!=-1){
                fos.write(i);
            }
            else{
                break;
            }
        }
        fos.flush();
    }
    catch(Exception e){
        e.printStackTrace();
    }
    finally{
        try{
            fos.close();
            fis.close();
        }
        catch(IOException ioe){
            System.out.println(ioe);
        }
    }
} 

答案 3 :(得分:0)

解决方案是将便携式Sqlite文件从其目录备份到SD-Card目录。您可以按照以下步骤执行此操作: -

1)将此permission添加到您的Manifest.XML文件中:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2)Java课程中调用以下方法:

public boolean packupDatabaseFile(){
    try {
        File sdCardDir = Environment.getExternalStorageDirectory();
        File dataDir = Environment.getDataDirectory();

        if (sdCard.canWrite()) {
            String dbPath = "//data//{your package name}//databases//{your database name}";
            String backupDBPath = "{database name}";
            File dbFile = new File(dataDir , currentDBPath);
            File backupDbFile = new File(sdCardDir , backupDBPath);

            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(dbFile ).getChannel();
                FileChannel dst = new FileOutputStream(backupDbFile ).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        }
    return true;//Success
    } catch (Exception e) {
    return false;//Failed to backup
    }
}

借助此Question

答案 4 :(得分:0)

当您使用SQLiteOpenHelper http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html时,这可以检测数据库的升级和降级。

所以方法

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion)

在创建新数据库之前,可以重写

以删除旧数据库