SQLiteOutOfMemoryException: Could not open database 分析和解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Naide_S/article/details/83041780
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了
有问题可以给我留言或者私信哦

猜你喜欢

转载自blog.csdn.net/Naide_S/article/details/83041780
今日推荐