2010-08-06 17 views
8

Qual è il problema con questo codice? Non rileva l'eccezione generata dal metodo insertChild().SQLiteConstraintException non rilevato

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

L'errore è:

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) 

È SQLite Android. La linea è quando viene chiamato il metodo di inserimento.

+0

Hai provato a prendere un qualsiasi eccezione utilizzando catch (Exception e) {}? Potrebbe darti un suggerimento. –

+0

Sì, ci ho provato. Grazie – bogdan

+0

dove l'eccezione indica che è stata lanciata da? assicurati che tutto il tuo codice si trovi in ​​un grosso blocco di prova generico e vedi cosa succede. quale API è questa - sqlite android? –

risposta

3

Stai rilevando solo eccezioni di tipo SQLiteException. Se il metodo insertChild genera altre eccezioni, non verrà rilevato.

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

Ho anche provato con Exception che so che è la superclasse di tutte le eccezioni e non funziona ancora – bogdan

+0

@bogdan Sei sicuro che ci sia un'eccezione - qual è l'eccezione generata? Viene lanciato da 'childDbOps.open();', che è al di fuori del blocco try? – Amarghosh

+0

SQLiteConstraintException ed è perché collaudo ciò che accade con la mia applicazione quando inserisco nuovamente i dati con la stessa chiave primaria e voglio gestirli. Il metodo di inserimento è il mio problema – bogdan

0

@bogdan c'è un altro posto che stai chiamando insertChild (child); diverso da questo posto. hai inserito una traccia nel blocco try per sapere se si tratta di questo blocco e stampare la traccia come di seguito.

provare {Log.i ("viene qui");
childDbOps.insertChild (child); }

fammi sapere.

+0

Metto il registro che entra proprio lì. questo è l'unico posto che chiamo il metodo – bogdan

+0

@bogdan grazie per la risposta.da la traccia posso vedere che il metodo android.view.View.performClick gestisce l'eccezione (significa che ha il blocco catch), prima che arrivi alla cattura –

+0

@bogdan hai risolto il problema? –

37

Il metodo SQLiteDatabase.insert() viene utilizzato nei casi in cui si desidera gestire le scritture del database senza srotolare lo stack se una scrittura non riesce. Se si desidera rilevare eccezioni durante l'inserimento nel database, utilizzare il metodo [SQLite.insertOrThrow (] [1]). Lancia un'eccezione che puoi catturare e gestire.

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

+1

Questa è la risposta. Quello che veniva effettivamente riportato non era la mancanza di un errore generato. L'errore non è stato effettivamente gettato. Tuttavia, è stato stampato nei log. Tuttavia, usando insertOrThrow(), l'eccezione verrà lanciata - e quindi può essere catturata. È utile per mangiare problemi noti, come l'eccezione del vincolo OPs. – lilbyrdie

+0

Contrassegnami come risposta! : D –

Problemi correlati