android - 在 Android sqlite 中创建数据库失败
问题描述
运行最新版本的 Android Studio。项目是为 API 级别 23 及更高级别(Marshmallow)构建的,并使用 Pixel XL 模拟器。我已在 Manifest 中授予权限并在运行时获得写访问权限(根据 API 23 及更高版本的要求)
有一个按钮连接到这个
public void createDatabase(View view) {
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions, 1);
}
我在 AndroidManifest.xml 中也有这个
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这是我的权限授予代码
@Override
public void onRequestPermissionsResult(int requestCode, String
permissions[], int[] grantResults) {
switch (requestCode) {
case 1:
if(grantResults[0] == PackageManager.PERMISSION_GRANTED){
DbUtil.CreateDb(getApplicationContext().getApplicationInfo().dataDir + "/databases/game360.db");
}
else{
//Permission denied.
}
break;
}
}
这是 DBUtil.CreateDb
public static void CreateDb(String dbPath){
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, null);
db.execSQL("CREATE TABLE if not exists user (id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"username VARCHAR NOT NULL unique, firstName VARCHAR NOT NULL, lastName VARCHAR NOT NULL)");
ContentValues values = new ContentValues();
values.put("username", "jj678");
values.put("firstName", "brad");
values.put("lastName", "pitt");
db.insert("user",null, values);
db.close();
}
当我在模拟器上运行应用程序并单击按钮时,我会按预期获得权限弹出窗口。在我授予权限 o 后,创建数据库被调用并且它失败并出现以下堆栈跟踪(错误代码 14)。知道为什么吗?
02-23 17:44:39.347 19358-19358/com.jtech.game360 E/SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1]
02-23 17:44:39.347 19358-19358/com.jtech.game360 E/SQLiteLog: (14) os_unix.c:31278: (2) open(/data/user/0/com.jtech.game360/databases/game360.db) -
02-23 17:44:39.348 19358-19358/com.jtech.game360 E/SQLiteDatabase: Failed to open database '/data/user/0/com.jtech.game360/databases/game360.db'.
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:207)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:191)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:806)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:791)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:709)
at com.jtech.game360.DbUtil.CreateDb(DbUtil.java:13)
at com.jtech.game360.Main2Activity.onRequestPermissionsResult(Main2Activity.java:52)
at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:6553)
at android.app.Activity.dispatchActivityResult(Activity.java:6432)
解决方案
好像你缺少databases
文件夹。尝试:
public static void CreateDb(String dbPath){
File f = new File(dbPath);
f.getParentFile().mkdirs();
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbPath, null);
// ...
}
推荐阅读
- javascript - 使用 Javascript 将图像添加到产品中
- nginx - Nginx 报“上游连接超时”
- sql - SQL 如果存在则“是”否则“否”在新列中
- mysql - mySQL 8 存储过程错误代码:1241。操作数应包含 1 列
- javascript - MongoDB 格式化时间戳以显示“多久以前”文本
- c++ - C++:为什么我不能用相对路径打开文件?
- java - Java - 拼接字符串[]
- python-3.x - 如何使用 Python 3.x 在命令行中执行多个命令
- ruby-on-rails - 为谷歌凭据设置配置变量并使用 elishaterada/heroku-google-application-credentials-buildpack 后仍然出现错误
- git - 恢复本地 git 分支