Android无法创建SQLite数据库

时间:2019-05-04 17:59:21

标签: java 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文件

2 个答案:

答案 0 :(得分:1)

由于文件或目录不存在,无法打开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+ requested permission

我个人只是添加了此类:-

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

答案 1 :(得分:0)

这可能是您要寻找的路径:

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

类似于/data/user/0/appname/databases/database.db