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