Android не удается создать базу данных SQLite - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь создать базу данных SQLite в моем приложении с этим кодом:

myDataBase = SQLiteDatabase.openOrCreateDatabase(DB_FULL_PATH, null);

DB_FULL_PATH:

Environment.getExternalStorageDirectory().toString() + "/app_name/databse.db";

Папка существует в моем приложении My files.

Кроме того, я уже проверил, и у меня есть следующие разрешения в моем приложении:

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

Когда я вызываю метод create DB, я получаю следующее исключение:

android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 1294): Could not open database
#################################################################
Error Code : 1294 (SQLITE_CANTOPEN_ENOENT)
Caused By : Specified directory or database file does not exist.
    (unknown error (code 1294): Could not open database)
#################################################################

А, почему вы не создали базу данных?

EDIT

compileSdkVersion 25
buildToolsVersion '26.0.2'
useLibrary 'org.apache.http.legacy'
defaultConfig {
    multiDexEnabled true
    minSdkVersion 16
    targetSdkVersion 18
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    renderscriptTargetApi 22
    renderscriptSupportModeEnabled true
}

Я также добавляю файл сборки gradle

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Невозможно открыть ENOENT, так как он говорит, что файл или каталог не существует.

Вы, вероятно, можете полагаться на Environment.getExternalStorageDirectory (). ToString (), возвращающий существующий каталог.

Однако после этого вы добавляете / app_name / databse.db вполне вероятно, что каталог app_name может не существовать. Поэтому вы должны создать каталог, если он не существует.

Например, вы можете использовать: -

    File dbpath = (new File(Environment.getExternalStorageDirectory().toString() + "/app_name/databse.db"));
    if (!(new File(dbpath.getParent()).exists())) {
        new File(dbpath.getParent()).mkdirs();
    }
    myDatabase =  SQLiteDatabase.openOrCreateDatabase(dbpath,null);

Вышеприведенное предполагает, что вы, для API 23+, запросили разрешение у приложения в дополнение к запросу разрешения через манифест.

Лично я просто добавлю этот класс: -

class ExternalStoragePermissions {

    public int API_VERSION = Build.VERSION.SDK_INT;
    private static final int REQUEST_EXTERNAL_STORAGE = 1;
    private static String[] PERMISSIONS_STORAGE = {

            Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    private ExternalStoragePermissions() {}
    // Note call this method
    public static void verifyStoragePermissions(Activity activity) {

        int permission = ActivityCompat.checkSelfPermission(
                activity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE);

        if(permission != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(
                    activity,
                    PERMISSIONS_STORAGE,
                    REQUEST_EXTERNAL_STORAGE
            );
        }
    }
}

и убедитесь, что он вызывается, если требуется, перед выполнением таких запросов.

например. : -

    if (Build.VERSION.SDK_INT >= 23) {
        ExternalStoragePermissions.verifyStoragePermissions(this);
    }
  • WRITE автоматически выдает READ
0 голосов
/ 05 мая 2019

Это может быть путь, который вы ищете:

String path = this.getContext().getDatabasePath("database.db").getAbsolutePath();

что-то похожее /data/user/0/appname/databases/database.db.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...