Почему мой обработчик исключений не улавливает ошибку вставки SQLite SQLite?
Я использую SQLite в первый раз и пытаюсь изучить его обработку исключений, поэтому я заставляю ошибку вставки в своем тестовом приложении. Исключение происходит, и я вижу, что он написан в окне вывода Eclipse LogCat. Однако он не попадает в код. Я видел здесь другие вопросы о том, как правильно использовать правильный тип исключения и думаю, что у меня все в порядке. Любая идея, что мне не хватает?
В следующем выражении, которое находится в моем основном действии, myTable
- это класс, который расширяет мой собственный AbstractDbAdapter
(который имеет класс DatabaseHelper
, который расширяет SQLiteOpenHelper
).
try {
myTable.create("dupkey");
}
catch (android.database.sqlite.SQLiteConstraintException e) {
Log.e(TAG, "SQLiteConstraintException:" + e.getMessage());
}
catch (android.database.sqlite.SQLiteException e) {
Log.e(TAG, "SQLiteException:" + e.getMessage());
}
catch (Exception e) {
Log.e(TAG, "Exception:" + e.getMessage());
}
Пример трассировки стека:
Error inserting id="dupkey" last_seen_ts=1360624732 first_seen_ts=1360624732 android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:61)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1582)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1426)
at com.myCompany.testApp.myTable_DbAdapter.create(myTable_DbAdapter.java:51)
Классы myTable
и AbstractDbAdapter
:
public class myTable_DbAdapter extends AbstractDbAdapter {
private static final String DATABASE_TABLE = "myTable";
// column names -- keys for ContentValues()
public static final String KEY_ID = "id";
public static final String KEY_FIRST_SEEN = "first_seen_ts";
public static final String KEY_LAST_SEEN = "last_seen_ts";
public myTable_DbAdapter(Context ctx) {
super(ctx);
}
public long create(String id) {
long firstSeen = System.currentTimeMillis() / 1000; // SQLite timestamps are in seconds
ContentValues args = new ContentValues();
args.put(KEY_ID, id);
args.put(KEY_FIRST_SEEN, firstSeen);
args.put(KEY_LAST_SEEN, firstSeen); // defaults to firstSeen for a new entry
return mDb.insert(DATABASE_TABLE, null, args);
}
}
public abstract class AbstractDbAdapter {
protected static final String TAG = "AbstractDbAdapter";
protected DatabaseHelper mDbHelper = null;
protected SQLiteDatabase mDb = null;
protected static final String TABLE_CREATE_MYTABLE =
"create table myTable (" +
" id text primary key not null" +
", first_seen_ts integer not null" +
", last_seen_ts integer not null" +
");";
protected static final String DATABASE_NAME = "myDB";
protected static final int DATABASE_VERSION = 1;
protected final Context mCtx;
protected static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// Note: SQLite requires one execSQL per table
db.execSQL(TABLE_CREATE_MYTABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which destroys existing data.");
db.execSQL("DROP TABLE IF EXISTS myTable");
onCreate(db);
}
}
public AbstractDbAdapter(Context ctx) {
this.mCtx = ctx;
}
public AbstractDbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
if (mDb != null) {
mDb.close();
mDb = null;
}
if (mDbHelper != null) {
mDbHelper.close();
mDbHelper = null;
}
}
}
Ответы
Ответ 1
Я нашел ответ здесь: SQLiteConstraintException не пойман
Метод SQLiteDatabase.insert() не генерирует исключения. d'о!
Для других новичков SQLite, таких как я, если вы хотите поймать исключения при вставке в базу данных, используйте метод SQLite.insertOrThrow(). Он выдает исключение, которое вы затем можете поймать и обработать.