Scrivere il codice completo per un database con un campo _id e due campi text, quindi estrarre il secondo record e scrivere in LogCat i valori dei due campi text.
Tutto il codice è in MainActivity:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Helper helper=new Helper(this); helper.save("Mario", "Rossi"); helper.save("Giuseppe", "Verdi"); helper.save("Ludwig", "van Beethoven"); String valore=helper.query(2).getString(1); Log.v("VALORE",valore); } class Helper extends SQLiteOpenHelper{ public Helper(Context context) { super(context, "Database.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table TABELLA(_id integer primary key,nome text,cognome text)"); } public Cursor query(int numero){ SQLiteDatabase db=this.getWritableDatabase(); Cursor crs=db.rawQuery("select * from TABELLA where _id="+numero, null); crs.moveToFirst(); return crs; } public void save(String nome, String cognome){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("nome", nome); values.put("cognome", cognome); db.insert("TABELLA", null, values); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub } } }
Ora dobbiamo studiare i constraint.
Creiamo un database sul tipo di quello di cui sopra, con il nome come campo unico.
Apporto delle modifiche al metodo onCreate della classe Helper.
public void onCreate(SQLiteDatabase db) { db.execSQL("create table TABELLA(_id integer primary key,nome text,cognome text, unique(nome) on conflict fail)"); }Vediamo cosa accade.
Ecco, coi nomi di cui sopra, tutti diversi, ovvio che non accade niente anche se il constraint funziona.
Metto due nomi uguali:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Helper helper=new Helper(this); helper.save("Mario", "Rossi"); helper.save("Giuseppe", "Verdi"); helper.save("Giuseppe","Mazzini"); }Ecco: Nel database mi vengono inseriti solo i primi valori, Mario Rossi e Giuseppe Verdi, mentre il terzo viene ignorato.
Il programma non crasha, ma ottengo la segnalazione di errore in LogCat:
06-22 23:20:47.497: E/SQLiteLog(22909): (2067) abort at 12 in [INSERT INTO TABELLA(nome,cognome) VALUES (?,?)]: UNIQUE constraint failed: TABELLA.nome 06-22 23:20:47.498: E/SQLiteDatabase(22909): Error inserting nome=Giuseppe cognome=Mazzini> Ora facciamo un constraint impostando come unique nome e cognome.
Poi metto un Giuseppe Mazzini, un Giuseppe Garibaldi, un'Anita Garibaldi e un altro Giuseppe Mazzini. Voglio vedere se mi viene bloccata solo la combinazione di nome e cognome anziché i nomi e cognomi unici.
@Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table TABELLA(_id integer primary key,nome text,cognome text, unique(nome,cognome) on conflict fail)"); }E creiamo i nomi...
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Helper helper=new Helper(this); helper.save("Mario", "Rossi"); helper.save("Giuseppe", "Mazzini"); helper.save("Giuseppe", "Garibaldi"); helper.save("Anita", "Garibaldi"); helper.save("Giuseppe","Mazzini"); }Ottimo:
ottengo:
Mario Rossi Giuseppe Mazzini Giuseppe Garibaldi Anita Garibaldie non il secondo Giuseppe Mazzini.
Il messaggio di errore (senza che peraltro il programma crashi) è
06-22 23:27:53.420: E/SQLiteLog(26154): (2067) abort at 13 in [INSERT INTO TABELLA(nome,cognome) VALUES (?,?)]: UNIQUE constraint failed: TABELLA.nome, TABELLA.cognome
06-22 23:27:53.421: E/SQLiteDatabase(26154): Error inserting nome=Giuseppe cognome=Mazzini
06-22 23:27:53.421: E/SQLiteDatabase(26154): android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: TABELLA.nome, TABELLA.cognome (code 2067)
Sì: è solo la combinazione di nome e cognome ripetuta che crea l'eccezione.Per gestire l'eccezione:
public void save(String nome, String cognome){ SQLiteDatabase db=this.getWritableDatabase(); ContentValues values=new ContentValues(); values.put("nome", nome); values.put("cognome", cognome); try{ db.insertOrThrow("TABELLA", null, values); }catch(SQLiteConstraintException e){ Toast.makeText(getApplicationContext(), "Errore unique", Toast.LENGTH_LONG).show(); } }Ottengo ugualmente un messaggio di errore in LogCat, ma posso almeno gestirlo.
Adesso voglio ripassare le condizioni della query SELECT: anziché scrivere così
public Cursor query(int numero){ SQLiteDatabase db=this.getWritableDatabase(); Cursor crs=db.rawQuery("select * from TABELLA where _id="+numero, null); crs.moveToFirst(); return crs; }posso scrivere usando un array:
public Cursor query(int numero){ SQLiteDatabase db=this.getWritableDatabase(); Cursor crs=db.rawQuery("select * from TABELLA where _id=?", new String[]{numero+""}); crs.moveToFirst(); return crs; }Questo array può portare solo Stringhe, per cui devo convertire il numero in stringa sommandolo a una stringa vuota.
Nessun commento:
Posta un commento