Ho un database SQLite in Android e utilizzo uno ContentProvider
per gestire le operazioni, che vengono mantenute su una tabella con un qualificatore UNIQUE in una colonna.È corretto fare affidamento su un SQLiteConstraint e lasciare che SQLite esegua il controllo per me? C'è un problema?
Problema:
Tuttavia, quando ho insert
valori duplicati nel database, non si rompe il mio codice di per sé, ma sputa ancora migliaia di SQLiteConstraintException
linee tronchi, e al mio utente che sembra proprio di inquinare il Log, qualcosa di non lucidato. Ho provato a rilevare l'eccezione solo per sperimentare, ma registra ancora.
Domanda:
Allora, come faccio in silenzio quelle linee di registro? È possibile?
Si prega di leggere il commento qui sotto per il motivo di porre la domanda.
Errore:
colonna Ora ha il UNIQUE
vincolo:
Error inserting Factor=2.0 Time=1325375465000 Extra=none
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:55)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1549)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
at mypackage.myapp.provider.DataProvider.bulkInsert(DataProvider.java:353)
at android.content.ContentProvider$Transport.bulkInsert(ContentProvider.java:179)
at android.content.ContentResolver.bulkInsert(ContentResolver.java:646)
at mypackage.myapp.service.MyService.onHandleIntent(MyService.java:96)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.os.HandlerThread.run(HandlerThread.java:60)
mi sento che tutto questo significa che quello che sto cercando di fare è un modo pigro per recuperare da un inserto duplicato su un vincolo univoco, da qui il "rozzo" sentire nel registro. Probabilmente sto risolvendo meglio qualunque cosa stia creando le voci duplicate (e chiamando gli inserti) per cominciare. Sono tutto per la scorrevolezza. Ma questo solleva la domanda (per me): perché non possiamo semplicemente "scaricare" in sicurezza il lavoro sul correttore dei vincoli e lasciarlo fallire log-silenziosamente? Nel caso volessimo ... forse ci aspettiamo duplicati ... quindi niente di cui preoccuparsi. Forse la nostra fonte di dati, fuori dal nostro controllo, è difettosa per cominciare con ... – davidcesarino
Commentare dopo aver risposto: come ho detto, ero pigro di proposito, ai fini di questa domanda, poiché stavo cercando di non codificare gli assegni e lascialo a SQLite chiedendo 1) sicurezza (concorrenza), 2) efficienza (è sqlite migliore/più veloce di me su quello? probabilmente) e anche 3) praticamente (meno codice). Tuttavia, alcune cose mi sono venute in mente (il conteggio delle righe di inserimento), quindi ho implementato il controllo dups oltre ai limiti. Ad ogni modo, sono finito molto soddisfatto del mio codice riguardante (1). Ricorda questo quando leggi questa domanda. – davidcesarino
Se non si sta utilizzando android.util.Log autonomamente, allora perché si preoccupa di registrare errori per l'utente? –