Невозможно открыть базу данных в Android Pie (Android 9)

Я использовал функцию checkDataBase, чтобы убедиться, что база данных уже существует, чтобы избежать повторного копирования файла каждый раз, когда вы открываете приложение в Oreo. Но в Android Pie это не работает.

private boolean checkDataBase (String dbName, int dbVersion) {

    SQLiteDatabase checkDB = null;

    try {

        String myPath = DB_PATH + dbName;
        checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.CONFLICT_ABORT);

        if (checkDB.getVersion() < dbVersion) {
            Timber.d("Delete database called");
            myContext.deleteDatabase(dbName);
            return false;
        }
    } catch(SQLiteException e) {

    }

    if(checkDB != null){
        checkDB.close();
    }

    return checkDB != null;
}

Получение этой ошибки: os_unix.c:36667: (2) open(/data/data/my.androidPieTrial.app/databases/admin.db) android.database.sqlite.SQLiteCantOpenDatabaseException: неизвестная ошибка (код 14 SQLITE_CANTOPEN): не удалось открытая база данных


person Veeresh P    schedule 20.08.2018    source источник


Ответы (3)


Я получил решение. В Android Oreo и более ранних версиях способ доступа к базе данных работает нормально, но в Android Pie он не работает. Это способ справиться с этим в Android Pie.

if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        MySQLiteOpenHelper helper = new MySQLiteOpenHelper();
        SQLiteDatabase database = helper.getReadableDatabase();
        myPath = database.getPath();

    } else {
        String DB_PATH = Environment.getDataDirectory() + "/data/my.trial.app/databases/";
        myPath = DB_PATH + dbName;
    }

    checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
    checkDB.disableWriteAheadLogging();
person Veeresh P    schedule 22.08.2018
comment
у меня такая же проблема, не могли бы вы помочь мне разобраться с этой проблемой, я не могу понять, что вы говорите в этом фрагменте кода, не могли бы вы объяснить подробнее - person Developers Park; 04.10.2018
comment
@APOORVADOSHI в основном вместо использования жестко закодированного пути, основанного на Environment.getDataDirectory для Pie, используется улучшенный метод (получение пути через систему). Однако на самом деле правильный способ - использовать context.getDatabasePath(the_database_name).getAbsolutePath(); (который был доступен с API 1 и, следовательно, работает со всеми версиями). - person MikeT; 03.11.2018
comment
Я также сталкиваюсь с той же проблемой. Не могли бы вы поделиться классом MySQLiteOpenHelper, потому что в противном случае действительно неясно, как решить проблему. - person Faisal; 19.11.2018
comment
это сработало для меня, но важной частью было использование: checkDB.disableWriteAheadLogging(); - person u2tall; 15.08.2019
comment
У меня тоже такая же проблема, но она у меня не работает - person Tanveer Ahmed; 23.10.2019

Переопределите следующий метод в классе SQLiteOpenHelper для версии ОС Android PIE.

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        db.disableWriteAheadLogging();
    }
}
person Gaurav Agrawal    schedule 23.05.2019

context.getDatabasePath(the_database_name).getPath();

Работает нормально, так как getDatabasePath() возвращает абсолютный путь в файловой системе, где создана база данных. Работает для всех версий андроида

person Mansoor Ali    schedule 10.01.2019