Исключения SQLite не обрабатываются ORMLite? - PullRequest
2 голосов
/ 15 января 2012

Я особенно внимательно относился к тому, чтобы правильно обрабатывать все исключения SQLE из ORMLite в моем приложении, только чтобы обнаружить, что под SQLlite из Android ORMLite выдает исключения времени выполнения, которые им просто не нужны.

Есть ли способ избежать обработки исключений SQLiteExceptions И ORMLites Android и SQLExceptions для Android?

Вот пример трассировки стека от метода, который перехватывает SQLExceptions, но, очевидно, не SQLiteExceptions.

E/AndroidRuntime( 7308): Caused by: android.database.sqlite.SQLiteException: unable to open database file
E/AndroidRuntime( 7308):    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/AndroidRuntime( 7308):    at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1821)
E/AndroidRuntime( 7308):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
E/AndroidRuntime( 7308):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
E/AndroidRuntime( 7308):    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
E/AndroidRuntime( 7308):    at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544)
E/AndroidRuntime( 7308):    at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
E/AndroidRuntime( 7308):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E/AndroidRuntime( 7308):    at com.j256.ormlite.android.AndroidConnectionSource.getReadWriteConnection(AndroidConnectionSource.java:60)
E/AndroidRuntime( 7308):    at com.j256.ormlite.android.AndroidConnectionSource.getReadOnlyConnection(AndroidConnectionSource.java:50)
E/AndroidRuntime( 7308):    at com.j256.ormlite.stmt.StatementExecutor.buildIterator(StatementExecutor.java:189)
E/AndroidRuntime( 7308):    at com.j256.ormlite.stmt.StatementExecutor.query(StatementExecutor.java:153)
E/AndroidRuntime( 7308):    at com.j256.ormlite.dao.BaseDaoImpl.query(BaseDaoImpl.java:245)
E/AndroidRuntime( 7308):    at 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):    at au.com.ninthavenue.android.notes.activities.EditNote.loadTags(EditNote.java:257)
E/AndroidRuntime( 7308):    at au.com.ninthavenue.android.notes.activities.EditNote.onCreate(EditNote.java:119)

1 Ответ

1 голос
/ 16 января 2012

Я не уверен, что правильный ответ здесь с точки зрения правильных способов отловить множественные исключения, но я вижу это как ошибку в ORMLite . В большинстве мест (очевидно, не во всех) ORMLite пытается обернуть вызовы Android, чтобы перехватить и выбросить эти исключения как java.sql.SQLException s. Я изменил код в 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);

Я добавил эту ошибку в трекер и проверил исправление в стволе. Это будет в 4.34. Дайте мне знать, если вы обнаружите, что ORMLite неправильно упаковывает эти исключения.

...