拦截DB错误“文件已加密或不是数据库”

时间:2013-03-22 15:13:34

标签: android database sqlite

由于我正在尝试实现导入/导出数据,我想测试如果导入的文件不是用于管理错误的sqlite数据库会发生什么。

在logcat中,我有以下内容:

03-22 15:02:39.957: E/SQLiteLog(20407): (26) file is encrypted or is not a database
03-22 15:02:39.978: E/DefaultDatabaseErrorHandler(20407): Corruption reported by sqlite on database: /data/data/com.crbin1.ltd/databases/dbltd
03-22 15:02:40.017: E/DefaultDatabaseErrorHandler(20407): deleting the database file: /data/data/com.crbin1.ltd/databases/dbltd

应用程序只是为用户创建一个没有错误的新空数据库。

db import之后我调用以下代码(DatabaseLTD是我的SQliteOpenHelper类)

private void checkImportedDb() {
    try {
        DatabaseLTD dbltd = new DatabaseLTD(mCtx);
        SQLiteDatabase db = dbltd.getReadableDatabase();
    } catch (SQLiteException e) {
        e.printStackTrace();
    }
}

但是我无法拦截“文件已加密或不是数据库”错误。如何捕获错误来管理它?

1 个答案:

答案 0 :(得分:2)

SQLiteOpenHelper构造函数:

public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)

需要一个错误处理程序参数“DatabaseErrorHandler”。

  

在sqlite报告数据库损坏时使用,或者为null以使用默认错误处理程序。

这可能就是你要找的东西。

编辑:正如crbin1正确指出的那样,构造函数只有API> = 11。

对于API< 11我的(未经测试的)建议是打开数据库并获取表格列表:

Retrieve a list of all tables in the database

如果您要加载的数据库必须至少有一个,您可以检查数字,或者更好地确保特定表已经存在。

如果您希望能够检查空DB,作为最后的努力,您可以尝试使用SQLiteDatabase方法:

public static SQLiteDatabase openDatabase (String path, SQLiteDatabase.CursorFactory factory, int flags) 

我没有检查但我强烈怀疑此方法的文档不正确,因为有关“flag”参数的信息不一致,特别是行:

  

根据标志OPEN_READWRITE OPEN_READONLY CREATE_IF_NECESSARY和/或NO_LOCALIZED_COLLATORS打开数据库。

与“int flags”参数的存在发生冲突:

  用于控制数据库访问模式的

标志

我知道我是一个懒鬼,我应该自己检查一下,但是如果是这种情况,你可能会尝试使用openDatabase预先验证数据库,使用OPEN_READONLY而不使用CREATE_IF_NECESSARY,捕获异常(如果有的话) ,然后继续使用“标准”SQLiteOpenHelper方法。