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 文件
解决方案
无法打开 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
推荐阅读
- javascript - Angular:如何实现基于条件的点击事件?
- python - Kivy 按钮实现 - 我怎样才能用我的书面代码做到这一点?
- modelica - 如何将多个变量从一个模型传递到另一个模型(内部/外部)
- react-native - React native - 覆盖命令“react-native run-android”
- mercurial - hg pull 不检索更改
- php - 共享托管服务器上的 Python
- php - 查找正在调用它并在错误日志中输出为 NOT FOUND 的函数文件
- reactjs - 使外部布局知道反应静态中的当前路线
- android - 为什么在 clearFocus() 上会自动出现软键盘?
- ios - 根据表格视图中的文本更改按钮标题