Crash: android.database.sqlite.SQLiteOutOfMemoryException: unknown error (code 7): Could not open database
at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:301)
at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:220)
at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:512)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:206)
at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:178)
at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:908)
at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:878)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:699)
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:234)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
at com.loc.an.a(DBOperation.java)
at com.loc.an.a(DBOperation.java)
at com.loc.as.a(SDKDBOperation.java)
at com.loc.ag.c(Log.java)
at com.loc.aj.a(ErrorLogManager.java)
at com.loc.aj.a(ErrorLogManager.java)
at com.loc.ai.a(SDKLogHandler.java)
at com.loc.ai.uncaughtException(SDKLogHandler.java)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:693)
at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:690)
这个是SQLiteOutOfMemoryException 异常 打开database 失败造成的 看到这个失败我的第一想法是打开db 失败 后来结合使用和代码分析 发现具体错误还是 OutOfMemory 是由open database 造成的 oom
先说一下无法打开database 主要是两个方面 一个是db不存在 一个是没有权限
首先检查db不存在的问题 检查DB_PATH = “/data/data/com.nade/databases/”路径下是否有db文件 路径是否数据错误 在检查db文件是否损坏 然后看一下打开db文件时是否获取了读写权限android.permission.WRITE_EXTERNAL_STORAGE 如果没有添加 做完这些就可以了
看一下代码 然后分析oom
DB_PATH = “/data/data/com.nade/databases/”
DB_NAME = “nade.db”;
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
// 数据库已存在,do nothing.
} else {
// 创建数据库
try {
File dir = new File(DB_PATH);
if (!dir.exists()) {
dir.mkdirs();
}
File dbf = new File(DB_PATH + DB_NAME);
if (dbf.exists()) {
dbf.delete();
}
SQLiteDatabase.openOrCreateDatabase(dbf, null);
// 复制asseets中的db文件到DB_PATH下
copyDataBase();
} catch (IOException e) {
throw new Error("数据库创建失败");
}
}
}
// 检查数据库是否有效
private boolean checkDataBase() {
String myPath = DB_PATH + DB_NAME;
return new File(myPath).exists() ? true : false;
}
这段代码是我打开db 的代码 先检查是否存在 有的话 直接使用 没有的话就创建后使用 注意我是用的内置的db文件 检查只是为了安全 看上去似乎没有大问题 但有一点很关键 注意这两行我的书写是有错误的
File dir = new File(DB_PATH);
if (!dir.exists()) {
dir.mkdirs();
}
File dbf = new File(DB_PATH + DB_NAME);
if (dbf.exists()) {
dbf.delete();
}
每次调用的时候 都会新建两个文件 所以会造成一直调用创建 最后造成oom 把这段代码修改成 File dbf = context.getDatabasePath(DB_NAME); 直接在文件内查询db的路径就好了 不需要每次使用都会去创建 这样解决了oom了
有问题可以给我留言或者私信哦
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/19719,转载请注明出处。
评论0