Autore Topic: Sollevare eccezione se si inserisce una riga già presente  (Letto 677 volte)

Offline Gioce90

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Sollevare eccezione se si inserisce una riga già presente
« il: 24 Agosto 2012, 11:39:43 CEST »
0
Ciao a tutti  :-) avrei un problemino. Ho creato queste tabelle qui:

Codice: [Seleziona]
                String sql = "";
                sql += "CREATE TABLE Paziente ( " +
                                " _id INTEGER PRIMARY KEY," +
                                " id TEXT NOT NULL UNIQUE," +
                                " cf TEXT NOT NULL UNIQUE," +
                                " cognome TEXT NOT NULL," +
                                " nome TEXT NOT NULL," +
                                " data_nascita TEXT NOT NULL," +
                                " citta TEXT NOT NULL," +
                                " domicilio TEXT NOT NULL" +
                                ");";
                db.execSQL(sql);

E poi in un file java c'è questo metodo:

Codice: [Seleziona]
public void writePazienteTable(){
            mioDatabaseHelper = new PazientiDataBaseHelper(this);
            SQLiteDatabase db_write = mioDatabaseHelper.getWritableDatabase();
           
            ContentValues values = new ContentValues();
            values.put("id", "paz001");
            values.put("cf", "xxxyyy");
            values.put("cognome", "XXX");
            values.put("nome", "YYY");
            values.put("data_nascita", "1990/01/09");
            values.put("citta", "Bari");
            values.put("domicilio", "via inesistente 12");
            long id = db_write.insert("Paziente", null, values);
    }

Al primo inserimento... tutto okay.
Ora... se io richiamo writePazienteTable() una seconda volta... funziona tutto, però il LogCat mi segnala una caterva di errori (però il programma continua a girare tranquillamente).
Tutto è dovuto al fatto che ho reso id (e anche cf) UNIQUE, ovviamente.

Il programma funziona, ma mi chiedevo, è possibile catturare questa eccezione?
Mi spiego: se si cercasse di inserire un paziente già presente in tabella, lo smartphone dovrebbe visualizzare "Paziente già presente!" ^_^
Ho già provato con un try/catch con SQLiteConstraintException ma niente.
Sapreste aiutarmi?  :-P

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Sollevare eccezione se si inserisce una riga già presente
« Risposta #1 il: 24 Agosto 2012, 11:55:51 CEST »
+2
Basta leggere con attenzione la documentazione:

SQLiteDatabase | Android Developers

Il metodo "insert" se c'è un errore nell'inserimento non lancia una eccezione ma ritorna -1.
adb logcat | tee /tmp/logcat | grep TAG

Offline Gioce90

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Sollevare eccezione se si inserisce una riga già presente
« Risposta #2 il: 24 Agosto 2012, 12:19:04 CEST »
0
Basta leggere con attenzione la documentazione:

SQLiteDatabase | Android Developers

Il metodo "insert" se c'è un errore nell'inserimento non lancia una eccezione ma ritorna -1.

Ah non l'avevo notato è vero xD Grazie 1000! :) Però così il LogCat continua a essere "sporco" di errori, non ci si può fare nulla?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Sollevare eccezione se si inserisce una riga già presente
« Risposta #3 il: 24 Agosto 2012, 13:11:07 CEST »
+1
Basta guardare i sorgenti di Android, è open source:

Codice (Java): [Seleziona]
   /**
     * Convenience method for inserting a row into the database.
     *
     * @param table the table to insert the row into
     * @param nullColumnHack optional; may be <code>null</code>.
     *            SQL doesn't allow inserting a completely empty row without
     *            naming at least one column name.  If your provided <code>values</code> is
     *            empty, no column names are known and an empty row can't be inserted.
     *            If not set to null, the <code>nullColumnHack</code> parameter
     *            provides the name of nullable column name to explicitly insert a NULL into
     *            in the case where your <code>values</code> is empty.
     * @param values this map contains the initial column values for the
     *            row. The keys should be the column names and the values the
     *            column values
     * @return the row ID of the newly inserted row, or -1 if an error occurred
     */

    public long insert(String table, String nullColumnHack, ContentValues values) {
        try {
            return insertWithOnConflict(table, nullColumnHack, values, CONFLICT_NONE);
        } catch (SQLException e) {
            Log.e(TAG, "Error inserting " + values, e);
            return -1;
        }
    }

Come vedi non c'è l'eccezione perché viene  intercettata prima, ma stampa l'errore nel log. Se usi il metodo pubblico "insertWithOnConflict" e catturi l'eccezione puoi non stampare l'errore.
adb logcat | tee /tmp/logcat | grep TAG