2010-08-06 12 views
8

¿Cuál es el problema con este código? No capta la excepción arrojada por el método insertChild().SQLiteConstraintException no detectada

childDbOps.open(); 
try { 
    childDbOps.insertChild(child); 
} catch (SQLiteException exception) { 
    Log.i("error la inserare child", "on the next line"); 
    exception.printStackTrace(); 
} finally { 
    childDbOps.close(); 
} 

El error es:

ERROR/Database(320): android.database.sqlite.SQLiteConstraintException: error code 19: 
constraint failed at com.android.dataLayer.DbAdapter.insertChild(DbAdapter.java:169) 
    at com.android.activities.ChildInsertActivity.onClick(ChildInsertActivity.java:203) 
    at android.view.View.performClick(View.java:2344) 

Es sqlite androide. La línea es cuando se llama al método de inserción.

+0

¿Ha tratado de simplemente ponerse ninguna excepción usando catch (Exception e) {}? Puede darte una pista. –

+0

Sí, lo intenté. Gracias – bogdan

+0

¿de dónde indica la excepción que fue arrojado? asegúrese de que todo su código esté en un gran bloque de prueba genérico y vea qué sucede. ¿Qué API es esta - android sqlite? –

Respuesta

3

Estás capturando solo excepciones del tipo SQLiteException. Si el método insertChild arroja cualquier otra excepción, no será capturado.

try { 
    childDbOps.insertChild(child); 
} 
catch(SQLiteException exception) { 
    Log.i("error la inserare child", "on the next line"); 
    exception.printStackTrace(); 
} 
catch(AnotherException exception) { 
    //handle it 
} 
//Catch them all here 
catch(Exception exception) { 
    //handle it: must handle it, don't just swallow it. 
} 
finally { 
    childDbOps.close(); 
} 
+1

También probé con Exception que sé que es la superclase de todas las excepciones y todavía no funciona – bogdan

+0

@bogdan ¿Estás seguro de que hay una excepción? ¿Cuál es la excepción lanzada? ¿Lo lanza 'childDbOps.open();', que está fuera de try block? – Amarghosh

+0

SQLiteConstraintException y es porque pruebo lo que sucede con mi aplicación cuando ingreso nuevamente datos con la misma clave principal y quiero manejar esto. El método de inserción es mi problema – bogdan

0

@bogdan hay otro lugar al que llamas insertChild (niño); aparte de este lugar. Puso un trazo en el bloque de prueba para saber si se trata de este bloque e imprimir el trazo como se muestra a continuación.

try {Log.i ("aquí viene ");
childDbOps.insertChild (child); }

hágamelo saber.

+0

Pongo el registro que ingresa allí mismo. ese es el único lugar al que llamo el método – bogdan

+0

@bogdan gracias por la respuesta. de la traza puedo ver que el método android.view.View.performClick maneja la excepción (significa que tiene el bloque catch), antes de que llegue a tu captura –

+0

@bogdan ¿resolviste el problema? –

37

El método SQLiteDatabase.insert() se utiliza en los casos en los que desea controlar las escrituras de la base de datos sin desenrollar la pila si falla una escritura. Si desea detectar excepciones al insertar en la base de datos, use el método [SQLite.insertOrThrow (] [1]). Arrojará una excepción que luego podrá capturar y manejar.

[1]: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#insertOrThrow(java.lang.String, java.lang.String, android.content.ContentValues)

+1

Esta es la respuesta. Lo que en realidad se informó no fue la falta de captura de un error lanzado. El error en realidad no fue lanzado. Sin embargo, se estaba imprimiendo en los registros. Sin embargo, al usar insertOrThrow(), se lanzará la excepción, y luego se puede capturar. Eso es útil para evitar problemas conocidos, como la excepción de limitación de OP. – lilbyrdie

+0

¡Marcarme como tu respuesta! :RE –

Cuestiones relacionadas