1

因为我正在尝试实现导入/导出数据,所以我想测试如果导入的文件不是用于管理错误的 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();
    }
}

但我无法拦截“文件已加密或不是数据库”错误。我怎样才能捕捉到错误来管理它?

4

1 回答 1

2

SQLiteOpenHelper 构造函数:

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

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

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

这可能是您正在寻找的。

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

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

检索数据库中所有表的列表

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

如果您还希望能够检查空数据库,作为最后的努力,您可以尝试 SQLiteDatabase 方法:

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

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

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

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

控制数据库访问模式的标志

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

于 2013-03-22T15:23:40.733 回答