unknown error (Sqlite code 14): Could not open database解决方案

 

今天在运行之前一个项目是突然一运行就崩溃,感觉甚是奇怪,查看log日志发现:

Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (Sqlite code 14): Could not open database, (OS error - 13:Permission denied)


根据日志提示好像是缺少权限,因为项目只用到了存储,然后去查看AndroidManifest.xml中的权限,发现

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


这两条权限都在呀,这是怎么回事呢,百度了下都说是权限未添加。最后突然想到我这台手机是Android6.0的系统,然后为了验证,找了一台4.0系统的运行,直接就运行起来了,好了这下找到问题了就好解决了。
Android6.0以后出现了很多权限即使在AndroidManifest.xml中配置了也不行,必须手动请求,或者在设置-应用-权限打开对应的权限。
在6.0系统以后使用有些权限是可以进行这样的操作:

public static final int REQUEST_EXTERNAL_STORAGE = 1;
private static String[] PERMISSIONS_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
/**
* 验证读取sd卡的权限
*
* @param activity
*/
public boolean verifyStoragePermissions(Activity activity) {
/*******below android 6.0*******/
if (Build.VERSION.SDK_INT < 23) {
return true;
}
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
return false;
} else {
return true;
}

}

在调用请求权限的Activity中重写 
/**
 * 请求权限回调
 *
 * @param requestCode
 * @param permissions
 * @param grantResults
 */
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_EXTERNAL_STORAGE) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
showToast("授权成功");
} else {
showToast("授权失败,请去设置打开权限");
}
}
}

可以将权限名换掉变成请求其他权限。做一个小的记录,同时希望可以帮助有需要的人。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
如果你仍然遇到 "QSqlQuery::exec: database not open" 和 "QSqlQuery::prepare: database not open" 错误,尽管你确认数据库连接已经正确打开,那么可能是由于以下原因之一: 1. 链接名称问题:确保在使用 `QSqlQuery` 对象时,传递了正确的数据库连接名称。在你的代码中,连接名称为 "connect"。请使用 `QSqlDatabase::database()` 方法以及正确的连接名称来获取数据库连接。 ```cpp QSqlDatabase db = QSqlDatabase::database("connect"); QSqlQuery query(db); ``` 2. 数据库驱动程序问题:确保你使用的数据库驱动程序已正确加载,并与你的数据库类型兼容。可以使用 `QSqlDatabase::drivers()` 方法检查可用的数据库驱动程序列表。如果需要,尝试使用其他驱动程序或更新驱动程序版本。 3. 编译问题:如果你使用了外部数据库驱动程序库,如SQLite或MySQL,确保在编译和链接应用程序时正确设置了库路径和库文件。特别是在使用外部库时,Qt的插件系统可能需要额外的步骤来加载和使用这些库。 4. 数据库文件路径问题:再次检查数据库文件的路径是否正确,并且你有足够的权限读取该文件。如果数据库文件位于受限制的目录中(例如系统目录或只读目录),请尝试将其移动到其他位置,并确保你可以访问该位置。 如果以上方法仍然无法解决问题,请提供更多的上下文信息、代码示例和错误信息,以便我能够更详细地帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值