android sqlite exception-handling

¿Por qué mi controlador de excepciones no atrapa el error de inserción de SQLite en Android?



exception-handling (1)

Encontré la respuesta aquí: SQLiteConstraintException no se detectó

El método SQLiteDatabase.insert () no lanza una excepción. d''oh!

Para otros usuarios novatos de SQLite como yo, si desea detectar excepciones al insertar en la base de datos, use el método SQLite.insertOrThrow (). Lanzará una excepción que luego podrás atrapar y manejar.

Estoy usando SQLite por primera vez, y estoy tratando de aprender su manejo de excepciones, así que estoy forzando un error de inserción en mi aplicación de prueba. Se produce la excepción y la veo escrita en la ventana de salida de Eclipse LogCat. Sin embargo, no queda atrapado en el código. He visto otras preguntas aquí acerca de estar seguro de usar el tipo de excepción correcto, y creo que lo he entendido bien. ¿Alguna idea de lo que me estoy perdiendo?

En la siguiente declaración, que se encuentra en mi actividad principal, myTable es una clase que extiende mi propio AbstractDbAdapter (que tiene una clase DatabaseHelper que extiende 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()); }

Muestra de seguimiento de la pila:

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)

Las clases myTable y 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; } } }