База данных не удаляется при удалении приложения Android

У меня есть два основных вопроса.

  1. База данных не удаляется при удалении приложения.
  2. Загруженные файлы не будут удалены, пока приложение нестабильно.

В моем приложении для Android есть база данных. Я создаю его с помощью java

class as follows.

public DataBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) {
    super(context, name, factory, version, errorHandler);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // creating required tables
    db.execSQL(CREATE_TABLE_QUOTES);
    db.execSQL(CREATE_TABLE_FILTERS);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // on upgrade drop older tables
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUOTES);
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_QUOTES);
    // create new tables
    onCreate(db);
}

В коде для базы данных не указан конкретный путь.

Это код, как я загружаю файлы. И есть определенный путь, но также нельзя создавать папку в Android> data> com.myapp.

public String downloadImage(String img_url, int i) {
        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File (sdCard.getAbsolutePath() + "/fog/images/filters");
        // Make sure the Pictures directory exists.
        dir.mkdirs();
        File destinationFile = new File(dir, "filter"+i);
        String filepath = null;
        try{
            URL url = new URL("http://fog.wrapper.io/uploads/category/"+img_url+".png");

            HttpURLConnection conection = (HttpURLConnection)url.openConnection();
            conection.setRequestMethod("GET");
            conection.setRequestProperty("Content-length", "0");
            conection.setUseCaches(false);
            conection.setAllowUserInteraction(false);
            conection.connect();

            int status = conection.getResponseCode();

            switch (status) {
                case 200:
                case 201:
                    FileOutputStream fileOutput = new FileOutputStream(destinationFile);
                    InputStream inputStream = conection.getInputStream();
                    int totalSize = conection.getContentLength();
                    int downloadedSize = 0;
                    byte[] buffer = new byte[1024];
                    int bufferLength = 0;
                    while ( (bufferLength = inputStream.read(buffer)) > 0 )
                    {
                        fileOutput.write(buffer, 0, bufferLength);
                        downloadedSize += bufferLength;                            Log.i("Progress:","downloadedSize:"+downloadedSize+"totalSize:"+ totalSize) ;
                    }
                    fileOutput.close();
                    if(downloadedSize==totalSize) filepath = destinationFile.getPath();
                   Log.i("filepath:"," "+filepath) ;
                    return filepath;
            }

        } catch (IOException e) {
            Log.d("ImageManager", "Error: " + e);
        }
        return null;
    }
} // Get filters

Пожалуйста помогите. Извините за плохой английский.


person KZoNE    schedule 10.03.2016    source источник
comment
Проблема во всех версиях или только в 6.0 выше?   -  person Android Team    schedule 23.04.2018


Ответы (5)


в Android 6.0 Google добавила новую функцию под названием Auto Backup.

когда эта опция включена (по умолчанию включена), система Android копирует почти все каталоги и файлы, созданные системой, и загружает их в учетную запись Google Диска пользователя.

Когда пользователь переустанавливает приложение, Android автоматически восстанавливает данные приложения, независимо от того, как оно было установлено (через магазин Play, установку adb, первоначальную настройку устройства).

Операция восстановления выполняется после установки APK, но до того, как пользователь сможет запустить приложение.

страница разработчиков Android: https://developer.android.com/guide/topics/data/autobackup.html

person yeonseok.seo    schedule 28.12.2016
comment
Спасибо! Это было именно то, что вызывало проблему в моем приложении. Я исправил это, отключив автоматическое резервное копирование в своем приложении, установив для параметра allowBackup значение false. ‹приложение android:allowBackup=false› - person Hashim Akhtar; 10.02.2017
comment
Это была именно та проблема, которая была и у меня. Не знал бы об этом, если бы это не было размещено здесь. Спасибо - person Robert Vogl; 02.08.2018

ГРАФИЧЕСКИЙ ИНТЕРФЕЙС

Если это личная учетная запись и вам нужно удалить резервную копию для тестирования, вы можете перейти на drive.google.com для своей учетной записи и перейти в раздел резервных копий.

Выберите резервную копию, и вам будет предоставлена ​​возможность удалить резервные копии для определенного устройства:

Выберите резервные копии, а затем резервную копию для удаления

ПУТЬ ОБОЛОЧКИ ADB

Вы также можете сделать это из командной строки с помощью следующего:

adb shell bmgr wipe com.google.android.gms/.backup.BackupTransportService com.example.app

Вы можете найти более подробную информацию об этой команде здесь:

http://www.androiddocs.com/tools/help/bmgr.html#other

ИСПОЛЬЗОВАНИЕ ADB SHELL BACKUP MANAGER

Использование команды можно найти здесь:

https://github.com/aosp-mirror/platform_frameworks_base/blob/6f357d3284a833cc50a990e14b39f389b8972254/cmds/bmgr/src/com/android/commands/bmgr/Bmgr.java#L443

    System.err.println("usage: bmgr [backup|restore|list|transport|run]");
    System.err.println("       bmgr backup PACKAGE");
    System.err.println("       bmgr enable BOOL");
    System.err.println("       bmgr enabled");
    System.err.println("       bmgr list transports");
    System.err.println("       bmgr list sets");
    System.err.println("       bmgr transport WHICH");
    System.err.println("       bmgr restore TOKEN");
    System.err.println("       bmgr restore TOKEN PACKAGE...");
    System.err.println("       bmgr restore PACKAGE");
    System.err.println("       bmgr run");
    System.err.println("       bmgr wipe TRANSPORT PACKAGE");
    System.err.println("");
    System.err.println("The 'backup' command schedules a backup pass for the named package.");
    System.err.println("Note that the backup pass will effectively be a no-op if the package");
    System.err.println("does not actually have changed data to store.");
    System.err.println("");
    System.err.println("The 'enable' command enables or disables the entire backup mechanism.");
    System.err.println("If the argument is 'true' it will be enabled, otherwise it will be");
    System.err.println("disabled.  When disabled, neither backup or restore operations will");
    System.err.println("be performed.");
    System.err.println("");
    System.err.println("The 'enabled' command reports the current enabled/disabled state of");
    System.err.println("the backup mechanism.");
    System.err.println("");
    System.err.println("The 'list transports' command reports the names of the backup transports");
    System.err.println("currently available on the device.  These names can be passed as arguments");
    System.err.println("to the 'transport' and 'wipe' commands.  The currently selected transport");
    System.err.println("is indicated with a '*' character.");
    System.err.println("");
    System.err.println("The 'list sets' command reports the token and name of each restore set");
    System.err.println("available to the device via the current transport.");
    System.err.println("");
    System.err.println("The 'transport' command designates the named transport as the currently");
    System.err.println("active one.  This setting is persistent across reboots.");
    System.err.println("");
    System.err.println("The 'restore' command when given just a restore token initiates a full-system");
    System.err.println("restore operation from the currently active transport.  It will deliver");
    System.err.println("the restore set designated by the TOKEN argument to each application");
    System.err.println("that had contributed data to that restore set.");
    System.err.println("");
    System.err.println("The 'restore' command when given a token and one or more package names");
    System.err.println("initiates a restore operation of just those given packages from the restore");
    System.err.println("set designated by the TOKEN argument.  It is effectively the same as the");
    System.err.println("'restore' operation supplying only a token, but applies a filter to the");
    System.err.println("set of applications to be restored.");
    System.err.println("");
    System.err.println("The 'restore' command when given just a package name intiates a restore of");
    System.err.println("just that one package according to the restore set selection algorithm");
    System.err.println("used by the RestoreSession.restorePackage() method.");
    System.err.println("");
    System.err.println("The 'run' command causes any scheduled backup operation to be initiated");
    System.err.println("immediately, without the usual waiting period for batching together");
    System.err.println("data changes.");
    System.err.println("");
    System.err.println("The 'wipe' command causes all backed-up data for the given package to be");
    System.err.println("erased from the given transport's storage.  The next backup operation");
    System.err.println("that the given application performs will rewrite its entire data set.");
    System.err.println("Transport names to use here are those reported by 'list transports'.");
person dazza5000    schedule 30.07.2018
comment
Спасибо, это полезно, хотя немного разочаровывает то, что вы не можете выполнить очистку для каждого приложения, но вам придется удалить резервную копию всего устройства. - person Fran Marzoa; 01.11.2019
comment
Я обновил ответ, чтобы показать, как это сделать для каждого приложения. - person dazza5000; 14.01.2020
comment
отличный! проголосовал за ответ и комментарий. Это наиболее полезно. Спасибо! - person Fran Marzoa; 14.01.2020

Автоматическое резервное копирование можно отключить, установив android:allowBackup="false" в AndroidManifest.xml.

person FLash    schedule 23.04.2018
comment
Невозможно создать приложение, если этот параметр равен false. - person Anoop.P.A; 19.11.2019

Я наткнулся на этот вопрос, когда искал решение аналогичной проблемы, связанной с GreenDao - немного более подробный ответ здесь, но в основном, если вы используете API 23, вам нужно установить для параметра allowBackup значение false, чтобы иметь возможность зависеть от баз данных. очищается при удалении

https://stackoverflow.com/a/43046256/5298819

person Michael.    schedule 27.03.2017

  1. Взгляните на этот ответ SO:

Что происходит с базой данных Sqlite при удалении приложения

  1. Работает ли ваша БД (помимо того, что она не удаляется при удалении приложения)?

  2. Если он не работает должным образом, вы можете взглянуть на:

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html

Хотя это не обязательно связано с вашей проблемой, вы можете подумать о создании open() и close() для своей БД и использовать объект SQLiteOpenHelper в каждом - в open() вы должны использовать sqliteopenhelperObj.getWriteableDatabase(), а в close() вы должны использовать sqliteopenhelperObj.close().

http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#close

Редактировать:

  1. Если вы загрузили файлы на свое устройство в процессе тестирования приложения и хотите их удалить, вы можете использовать Device Monitor в Android Studio https://developer.android.com/tools/help/monitor.html Существует файловый менеджер, который позволит вам просматривать и редактировать файлы на ваших устройствах. . Вы также можете сделать это в командной строке с помощью ADB (Android Debug Bridge) https://developer.android.com/tools/help/adb.html
person robkriegerflow    schedule 10.03.2016
comment
Большое спасибо, я проверю это и скоро вернусь к вам, если возникнут какие-либо проблемы. - person KZoNE; 15.03.2016
comment
У меня такая же проблема. Я обновил нашу DatabaseHelper до новой версии и установил приложение в режиме отладки. После того, как я закончил свою недавно реализованную функцию, я использовал git, чтобы вернуться к некоторым предыдущим коммитам и попытался установить старую версию приложения. К сожалению, это не работает, потому что приложение всегда выдает ошибку, что оно не может понизить базу данных. Это сообщение появляется даже в том случае, если я удалил приложение вручную, прежде чем установить старую версию. Итак, я прихожу к выводу, что база данных не удаляется, если я удаляю приложение ... действительно разочаровывает и раздражает. - person jennymo; 25.08.2016