Исключение при использовании класса SQLiteAssetHelper

Я пытаюсь использовать SQLiteAssetHelper, чтобы скопировать мою предварительно заполненную базу данных в приложение для Android. . У меня есть Android-7 на моем устройстве (телефон Nvidia Shield и Motorola). В меню «Настройки» -> «Приложение» -> «MyApp» я включил разрешения Календарь, Местоположение и Хранилище.

У меня также есть следующие разрешения в файле манифеста

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

Когда я храню свою базу данных в папке assets/databases/databases, я получаю следующее исключение:

Вызвано: com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: невозможно записать /data/user/0/com.funcheap.funmapsf/databases/databases/MySFfuncheapDatabase.db в данные

Когда я храню свою базу данных в папке assets/databases, я получаю следующее исключение:

Причина: com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: отсутствуют файлы баз данных/баз данных/MySFfuncheapDatabase.db (или архив .zip, .gz) в ресурсах или целевая папка недоступна для записи

К сожалению, этот SO вопрос мне не помогает


person Ganesh kudva    schedule 23.10.2017    source источник
comment
Вам не нужно это разрешение для записи во внутреннюю область памяти вашего приложения (/data/.../<your app>/...). Используется только для внешнего хранилища (обычно /storage/emulated/0/...)   -  person Jeffrey Blattman    schedule 24.10.2017
comment
Предоставьте минимальный воспроизводимый пример, в частности, показывающий ваш подкласс SQLiteAssetHelper. Я думаю, что ваша проблема заключается в имени базы данных, которое вы предоставляете конструктору SQLiteAssetHelper. См. этот образец приложения, чтобы узнать, как использовать SQLiteAssetHelper.   -  person CommonsWare    schedule 24.10.2017
comment
Может ли это быть связано с тем, что путь дважды содержит каталог databases? т. е. следует ли использовать /data/user/0/com.funcheap.funmapsf/databases/MySFfuncheapDatabase.db вместо /data/user/0/com.funcheap.funmapsf/databases/databases/MySFfuncheapDatabase.db?   -  person MikeT    schedule 24.10.2017


Ответы (1)


Как сказал @miket, если вы ссылаетесь на внутренний путь, Android будет использовать эту ссылку. У меня была эта проблема, и это был мой очень неаккуратный тестовый код. ПРИМЕЧАНИЕ. Закомментированный вызов.

public void getINTERNAL(){
    Context context = this;
    File file = new File(context.getFilesDir().getAbsolutePath());
    String NT = String.valueOf(file);
    THE_PATH = NT+"/";
    System.out.println("INTERNAL PATH =========> "+THE_PATH);
}


public void getAvailable(){

    //getINTERNAL();

    String state = Environment.getExternalStorageState();

    if (state.equals(Environment.MEDIA_MOUNTED) && (!state.equals(Environment.MEDIA_MOUNTED_READ_ONLY))) {

        File removable = ContextCompat.getExternalFilesDirs(this, null)[1];
        THE_PATH = String.valueOf(removable);
        if(THE_PATH.length() > 4) {
            //THE_PATH = THE_PATH.substring(0, THE_PATH.length() - 5);
            THE_PATH = THE_PATH + "/Documents/";
            System.out.println("new path ====> "+THE_PATH);
        }
        System.out.println("EXTERNAL PATH ====> " + THE_PATH);
        System.out.println("Internal Path used if EXTERNAL PATH = NULL ");
        //getINTERNAL(); DO NOT CALL HERE YOU WILL CHANGE THE_PATH TO internal
        // no need to set THE_PATH for internal storage it will default on its own
        // WHY DOES THIS HAPPEN THE_PATH variable is PUBLIC STATIC hence it is GLOBAL
    }
}
person Vector    schedule 25.10.2017