web-dev-qa-db-ja.com

Android Pie(Android 9)でデータベースを開くことができません

Oreoでアプリケーションを開くたびにファイルが再コピーされないように、checkDataBase関数を使用してデータベースが既に存在するかどうかを確認しました。しかし、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):できませんでしたデータベースを開く

6
Veeresh P

私は解決策を得ました。 Android Oreo以下のバージョンでは、dbにアクセスする方法は正常に機能しますが、Android Pieでは機能しませんでした。これがそれを処理する方法です。 Androidパイ。

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();
9
Veeresh P
_context.getDatabasePath(the_database_name).getPath();
_

getDatabasePath()は、データベースが作成されたファイルシステム上の絶対パスを返すため、正常に動作します。

1
Mansoor Ali