JavascriptProva

lunedì 11 gennaio 2016

Ripasso dei Database SQL e creazione di più tabelle sul database.


Stavo pensando che forse potrei semplicemente, anziché usare onItemClickListener sulla AutoCompleteTextView, creare una tabella del database con una chiave a chiave unica... ma il rischio è che l'utente digiti una categoria in modo sbagliato e il programma la inserisca come categoria diversa quando nelle intenzioni dell'utente avrebbe dovuto essere una categoria già esistente.
Meglio mantenere la AutoComplete, ma potrei anche mettere la chiave unica...
Per il momento, cerchiamo di rimettere le mani sul database creando un'altra tabella.
Per fare questo, devo crearmi un'esercitazione sui database.

public class MainActivity extends Activity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  setContentView(R.layout.activity_main);
  
  DBHelper helper=new DBHelper(this);
  helper.save("Mario", "Deficiente");
  Log.d("RECORD",helper.query().getString(1)+" "+helper.query().getString(2));
 }
 
 class DBHelper extends SQLiteOpenHelper{

  public DBHelper(Context context) {
   super(context, "mioDatabase", null, 1);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("CREATE TABLE TABELLA(_ID INTEGER PRIMARY KEY, NOME TEXT, CATEGORIA TEXT)");
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   
  }
  
  public void save(String nome, String categoria){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("NOME", nome);
   values.put("CATEGORIA", categoria);
   db.insert("TABELLA", null, values);
   
  }
  
  public Cursor query(){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor crs=db.rawQuery("SELECT * FROM TABELLA", null);
   crs.moveToFirst();
   return crs;
  }
  
 }
...con tanto di verifica in LogCat. Ripetuto più volte.
Adesso devo creare un'altra tabella...

Finalmente ci sono riuscito! Ho avuto grossi problemi con la gestione di ContentValues fino a quando ho trovato il metodo clear() che ha risolto la situazione:
public class MainActivity extends Activity {
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  
  setContentView(R.layout.activity_main);
  DBHelper helper=new DBHelper(this);
  helper.save("Antonello","Scemo");
  Log.d("RISULTATO",helper.query().getString(1));
 }
 
 class DBHelper extends SQLiteOpenHelper{

  public DBHelper(Context context) {
   super(context, "mioDatabase", null, 1);
  
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
   db.execSQL("CREATE TABLE TABELLA(_ID INTEGER PRIMARY KEY, NOME TEXT)");
   db.execSQL("CREATE TABLE TABELLA2(_ID INTEGER PRIMARY KEY, CATEGORIA TEXT)");
   
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
   // TODO Auto-generated method stub
   
  }
  
  public void save(String nome, String categoria){
   SQLiteDatabase db=this.getWritableDatabase();
   ContentValues values=new ContentValues();
   values.put("NOME", nome);
   db.insert("TABELLA", null, values);
   values.clear();
   values.put("CATEGORIA", categoria);
   db.insert("TABELLA2", null, values);
  }
  
  public Cursor query(){
   SQLiteDatabase db=this.getWritableDatabase();
   Cursor crs=db.rawQuery("SELECT * FROM TABELLA2", null);
   crs.moveToFirst();
   return crs;
  }
  
 }
Ed ecco il risultato:
01-10 22:32:49.126: D/dalvikvm(16447): GC_CONCURRENT freed 0K, 1% free 14249K/14368K, paused 4ms+1ms, total 7ms
01-10 22:32:49.686: D/RISULTATO(16447): Scemo
01-10 22:32:49.786: D/gralloc_goldfish(16447): Emulator without GPU emulation detected.
01-10 22:32:49.876: I/ActivityManager(1224): Displayed com.example.lab10/.MainActivity: +1s257ms (total +20m1s538ms)
il dato preso dalla seconda tabella.

Ora potrei mettermi a giocherellare con le istruzioni SQL per maneggiare le tabelle...

Nessun commento:

Posta un commento