首页 > 解决方案 > Android 无法创建 SQLite 数据库

问题描述

我正在尝试使用以下代码在我的应用程序中创建 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)
#################################################################

知道为什么不创建数据库吗?

编辑

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 文件

标签: javaandroidsqlite

解决方案


无法打开 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

推荐阅读