6

我使用 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: unknown error (code 14 SQLITE_CANTOPEN): could not开放数据库

4

3 回答 3

13

我得到了解决方案。在 Android Oreo 及以下版本中,我访问 db 的方式工作正常,但在 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();
于 2018-08-22T05:54:48.517 回答
4

为 android PIE OS 版本覆盖 SQLiteOpenHelper 类上的以下方法。

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
        db.disableWriteAheadLogging();
    }
}
于 2019-05-23T06:06:42.500 回答
3
context.getDatabasePath(the_database_name).getPath();

工作正常,因为getDatabasePath()返回创建数据库的文件系统上的绝对路径。适用于所有版本的android

于 2019-01-10T11:08:31.073 回答