ITIS Max Planck di Lancenigo di Villorba (TV) A.S. 2013-2014 Prof. PAOLO TOSATO Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported . Programmazione mobile: ANDROID Terza lezione: gestione eventi e memorizzazione dati
Terza lezione: gestione eventi e memorizzazione dati
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
ITIS Max Planck di Lancenigo di Villorba (TV) A.S. 2013-2014
Prof. PAOLO TOSATO
Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Programmazione mobile: ANDROID Terza lezione: gestione eventi e memorizzazione dati
30/04/2014 3 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Gestione degli eventi
Metodi callback Vs event listener I metodi di callback • Formato: onTipoEvento() (ad esempio: onTouchEvent() ). • Eseguiti automaticamente ogni volta che un widget viene selezionato (ad
esempio quando un bottone viene toccato). • Per gestirli è necessario estendere il widget e ridefinire il metodo (un incubo
nel caso si abbiano diversi widget nell’interfaccia). Event listener • Formaro: setOnTipoEventoListener() (as esempio: setOnClickListener() ) • Si abbinano meglio con i layout definiti attraverso file XML. • Nel caso di GUI non troppo complesse, la classe Activity può essere lei stessa
30/04/2014 7 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Gestione degli eventi
Gli eventi più importanti
Click • Metodo sul widget: setOnClickListener() • Interfaccia per il gestore: View.OnClickListener. • Metodo da implementare: onClick(View view).
Click lungo (si mantiene la pressione per qualche istante) • Metodo sul widget: setOnLongClickListener(). • Interfaccia per il gestore: View.OnLongClickListener. • Metodo da implementare: onLongClick(View view).
Tocco (per rilevare un tocco qualsiasi su un componente) • Metodo sul widget: setOnTouchListener(). • Interfaccia per il gestore: View.OnTouchListener. • Metodo da implementare: onTouch(View view, MotionEvent event).
30/04/2014 8 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Gestione degli eventi
Gli eventi più importanti
Digitazione • Metodo sul widget: setOnKeyListener(). • Interfaccia per il gestore: View.OnKeyListener. • Metodo da implementare: onKey(View view, int keyCode, KeyEvent event).
Focus • Metodo sul widget: setOnFocusChangeListener(). • Interfaccia per il gestore: View.OnFocusChangeListener. • Metodo da implementare: onFocusChange(View view, boolean hasFocus).
30/04/2014 11 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Memorizzazione dei dati: file system
Storage interno • Per ottenere uno stream di output public FileOutputStream openFileOutput(String name, int mode) throws FileNotFoundException • Mode Context.MODE_PRIVATE Rende il file privato all'applicazione (crea il file se non esiste) Context.MODE_APPEND Agisce in append sul file specificato • Per ottenere uno stream di input public abstract FileInputStream openFileInput(String name) throws FileNotFoundException • Per cancellare un file: public boolean deleteFile(String name) • Per elencare i file nell’area riservata all’applicazione: public String[] fileList()
30/04/2014 12 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Memorizzazione dei dati: file system
Storage esterno • Controllare se disponibile: public static String getExternalStorageState()
• Environment.MEDIA_MOUNTED disponibile in lettura e scrittura • Environment.MEDIA_MOUNTED_READ_ONLY disponibile solo in lettura • Environment.XXX storage esterno non disponibile
• Per ottenere la radice dello storage esterno public static File getExternalStorageDirectory()
• Si sconsiglia di creare file direttamente nella radice dello storage. Android infatti organizza il suo storage esterno con una serie di directory standard (Music per la musica, Download per i file scaricati, ecc.).
30/04/2014 18 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Android comprende un piccolo DBMS, che gli sviluppatori possono richiamare per salvare ed organizzare i dati delle loro applicazioni. Perché utilizzare un DBMS? • Fatica risparmiata, sicurezza ed efficienza. • Richiede però una conoscenza base di SQL.
Il DBMS integrato in Android è SQLite (Open Source) • Scritto in C e funziona su Linux, Mac OS X e Windows. • Il sito di riferimento per SQLite è disponibile all’indirizzo:
30/04/2014 19 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Ogni applicazione crea ed utilizza uno o più database in maniera esclusiva. Database creati da un’applicazione non possono essere letti da altre applicazioni. Per utilizzare un database:
• Estendere la classe android.database.sqlite.SQLiteOpenHelper ed implementare i metodi onCreate() e onUpdate().
• Sulla classe Helper si possono chiamare i metodi • getReadableDatabase() per accedere al database in sola lettura • getWritableDatabase() per accedere al database in scrittura,
per inserire, aggiornare o cancellare record dalle tabelle.
30/04/2014 20 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Operazioni di aggiornamento public long insert(String table, String nullColumnHack, ContentValues values) SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("nome", "Mario"); values.put("cognome", "Rossi"); // ID del record appena creato, oppure -1 se il record non è stato creato long id = db.insert(“utenti", null, values);
30/04/2014 21 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
Memorizzazione dei dati: database
Operazioni di aggiornamento public int update(String table, ContentValues values, String whereClause, String[] whereArgs) SQLiteDatabase db = mioDatabaseHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(“nome", “Paolo"); String whereClause = "nome = ? AND cognome = ?"; String[] whereArgs = { "Mario", "Rossi" }; // Sia whereClause che whereArgs possono essere null int r = db.update(“utenti", values, whereClause, whereArgs);
30/04/2014 24 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
I cursori Sono gli oggetti di Android che permettono di navigare all’interno di un result set. Il cursore permette di ottenere il numero di righe restituite dalla query int count = cursor.getCount(); e muoversi all’interno del result set • public boolean moveToNext() • public boolean moveToFirst() • public boolean moveToLast() • public boolean moveToPrevious() • public boolean moveToPosition(int position)
Esempio: classe Helper public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DB_NAME = "mydb"; private static final int DB_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); } // Richiamato quando il database è già presente sul sistema, // ma stando al numero di versione richiesta, risulta obsoleto public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Aggiornamento delle tabelle }
Memorizzazione dei dati: database
30/04/2014 26 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
30/04/2014 27 Quest' opera è distribuita con licenza Creative Commons Attribuzione - Non commerciale - Condividi allo stesso modo 3.0 Unported.
// Richiamato quando il database deve essere creato per la prima volta, // cioè appena l’applicazione è stata installata public void onCreate(SQLiteDatabase db) { String sql = ""; sql += "CREATE TABLE utenti ("; sql += " _id INTEGER PRIMARY KEY,"; // campo di tipo contatore sql += " nome TEXT,"; sql += " cognome TEXT,"; sql += " sesso INTEGER)"; db.execSQL(sql); } }