JavascriptProva

mercoledì 22 giugno 2016

Ripasso di alcune caratteristiche dei database in Android

Voglio ripassare i Database.


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 Garibaldi
e 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