我特别小心地在我的应用程序中正确处理了来自ORMLite的所有SQLException,只是发现在ORMLite之下,android的sqlite会抛出运行时异常,就像它们根本不在乎一样。

有什么方法可以避免必须处理Android的SQLiteExceptions和ORMLites SQLExceptions?

这是来自捕获SQLExceptions的方法的示例堆栈跟踪,但显然不是SQLiteExceptions。

E / AndroidRuntime(7308):原因:android.database.sqlite.SQLiteException:无法打开数据库文件
E / AndroidRuntime(7308):位于android.database.sqlite.SQLiteDatabase.dbopen(本机方法)
E / AndroidRuntime(7308):位于android.database.sqlite.SQLiteDatabase。(SQLiteDatabase.java:1821)
E / AndroidRuntime(7308):位于android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
E / AndroidRuntime(7308):位于android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
E / AndroidRuntime(7308):位于android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
E / AndroidRuntime(7308):位于android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544)
E / AndroidRuntime(7308):位于android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
E / AndroidRuntime(7308):位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E / AndroidRuntime(7308):位于com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:60)
E / AndroidRuntime(7308):位于com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:50)
E / AndroidRuntime(7308):位于com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:189)
E / AndroidRuntime(7308):位于com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:153)
E / AndroidRuntime(7308):位于com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:245)
E / AndroidRuntime(7308):在com.j256.ormlite.stmt.QueryBuilder.query(QueryBuilder.java:250)
E / AndroidRuntime(7308):at au.com.ninthavenue.android.notes.application.TagsEM.getRecentTags(TagsEM.java:229)
E / AndroidRuntime(7308):位于au.com.ninthavenue.android.notes.activities.EditNote.loadTags(EditNote.java:257)
E / AndroidRuntime(7308):位于au.com.ninthavenue.android.notes.activities.EditNote.onCreate(EditNote.java:119)

最佳答案

我不确定在捕获多个异常的正确方法方面,这里的正确答案是什么,但是我将其视为ORMLite中的错误。在大多数地方(显然不是全部),ORMLite会尝试包装Android调用以捕获这些异常并将其重新抛出为java.sql.SQLException。我将签入中继的AndroidConnectionSource中的代码更改为以下代码:

SQLiteDatabase db;
try {
    db = helper.getWritableDatabase();
} catch (android.database.SQLException e) {
    throw SqlExceptionUtil.create("Unable to get writable database", e);
}
connection = new AndroidDatabaseConnection(db, true);


我已对跟踪器added this bug进行了检查,并检入了对树干的修复。它将在4.34中。如果您发现其他地方ORMLite没有正确包装这些异常,请告诉我。

08-04 01:06