lezione 6 - mauriziocozzetto.net · programmare sqlite (1/4) import...
TRANSCRIPT
Corso Base
Maurizio Cozzetto, Francesco Sarasini
Lezione 6
Database SQLite (1/2)“Android provides full support for SQLiteSQLite databasesdatabases. Any databases you create will be accessible by name to anyany class in the application, but not outsidenot outside the application.”
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Database SQLite (2/2)Bisogna estendere la classe SQLiteOpenHelperSQLiteOpenHelper e sovrascrivere i metodi onCreateonCreate() e onUpgradeonUpgrade()
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (1/4)
import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;...public class MioDatabaseHelper extends SQLiteOpenHelper{
final static String DB_NAME = "nome_db"; final static int DB_VERSION = 1;
public MioDatabaseHelper(Context context) {super(context, DB_NAME, null, DB_VERSION);
} ...// continua
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (2/4)
...@Overridepublic void onCreate(SQLiteDatabase db) {
// creazione delle tabelle}
@Overridepublic void onUpgrade(SQLiteDatabase db,
int oldVersion, int newVersion) {// aggiornamento delle tabelle
}
} // fine classe MioDatabaseHelper
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (3/4)
// per creare le tabelle si usa execSQL()String sql = "";
sql = "CREATE TABLE rubrica(";// id è incrementato automaticamentesql = sql + "id INTEGER PRIMARY KEY,";sql = sql + "nome TEXT NOT NULL,";sql = sql + "cognome TEXT NOT NULL,";sql = sql + "telefono TEXT NOT NULL";sql = sql + ")";
db.execSQL(sql);
// da inserire in onCreate()
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Programmare SQLite (4/4)
public class MiaActivity extends Activity {
MioDatabaseHelper mioDatabaseHelper;
@Overridepublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);mioDataBaseHelper = new MioDatabaseHelper(this);
}...
}
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Apertura del database
// da qualche parte nell'Activity
SQLiteDatabase db = mioDatabaseHelper.getWriteableDatabase();
// oppure
SQLiteDatabase db = mioDatabaseHelper.getReadableDatabase();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Apertura in letturae scrittura
Apertura in solalettura
Inserimento di un contatto (1/2)
// apertura in scritturaSQLiteDatabase db = mioDatabaseHelper.getWriteableDatabase();
// mappa dei valori da inserireContentValues values = new ContentValues();
values.put("nome", "Maurizio");values.put("cognome", "Cozzetto");values.put("telefono", "123-123456789");
// continua ...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Caricamento del record nella mappa
Inserimento di un contatto (2/2)
// il metodo ritorna l'id del record appena creato// oppure -1 se non è possibile creare il recordlong id = db.insert("rubrica", null, values);
if (id == -1) {// errore!db.close(); return;
}
// chiusura del databasedb.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Scrittura del record
Aggiornamento di un contatto (1/2)// apertura in scritturaSQLiteDatabase db = mioDatabaseHelper.getWriteableDatabase();
// mappa dei valori da inserireContentValues values = new ContentValues();
// informazione da aggiornarevalues.put("telefono", "456-789012345");
// continua...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Caricamento dei nuovidati nella mappa
Aggiornamento di un contatto (2/2)// clausola whereString whereClause = "nome = 'Mario' AND cognome = 'Rossi'";
// r è il numero di record aggiornatiint r = db.update("rubrica",values,whereClause,null);
if (r==0) {// errore!db.close();return;
}// chiusura del databasedb.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Registrazione dei nuovidati
Cancellazione di un contatto (1/2)
// apertura in scritturaSQLiteDatabase db = mioDatabaseHelper.getWriteableDatabase();
// clausola wherewhereClause = "id = ?";
// valore di idString[] whereArgs = {"1"};
// continua...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Eventuali filtri
Cancellazione di un contatto (2/2)
// cancellazione// r restituisce il numero di record cancellatiint r = db.delete("rubrica", whereclause, whereArgs);
if (r==0) {// errore!db.close();return;
}
// chiusura del databasedb.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Cancellazione del record
Esecuzione di una query (1/2)
// Esecuzione di query SQLSQLiteDatabase db = mioDatabaseHelper.getReadableDatabase();
String[] columns = {"id"};String selection = "cognome = ?";String selectionArgs = {"Rossi"};
String orderBy = "id ASC";
Cursor cursor = db.query("rubrica",columns, selection, selectionArgs,null, null, orderBy);
// continua...
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
L'esecuzione di unaquery restituisce un cursore
Esecuzione di una query (2/2)
while (cursor.moveToNext()) {int id = cursor.getInt(0);String nome = cursor.getString(1);String cognome = cursor.getString(2);String telefono = cursor.getString(3);// fai qualcosa con i campi
}
db.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Scorriamo il risultatodella query medianteIl cursore
Content Providers (1/7)“Content providers storestore and retrieveretrieve data and make it accessible to all applications.They're the only way to shareshare data across applications; there's no common storage no common storage area area that all Android packages can access....Android exposes several native databasesnative databases using Content Providers.”
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (2/7)Ogni tipo di contenuto è esposto mediante un URIURI della forma
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
A. Prefisso standard che indica che il dato è controllato da un Content Provider
B. La “Authority Part” cioè il Content Provider stesso
C. Il percorso che il Content Provider usa per determinare quale tipo di dato è richiesto
D. L'id del record specifico richiesto
Content Providers (3/7)“You do not need to write the URIs of the content providers manually as they are stored as constant values in their respective content provider classes.”
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
content://com.android.contacts/contacts
android.provider.ContactsContract.Contacts
Contacts.CONTENT_URIPackage
Uri dei contatti
Costante che restituiscela Uri dei contatti
Content Providers (4/7)Android dispone di diversi Content Provider built-inbuilt-in, quali le immaginiimmagini, i contatticontatti della rubrica, i bookmarkbookmark del browser, le chiamatechiamate ricevute, i file multimedialifile multimediali e le impostazioni impostazioni del device.
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (5/7)
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Browser Use the browser Content Provider to read or modify bookmarks, browser history, or web searches.
CallLogView or update the call history, including both incoming and outgoing calls, together with missed calls and call details like caller ID and call durations.
SettingsYou can access the device’s preferences.
...
Content Providers (6/7)Per interagire con il Content Provider che eroga i contenuti, si usa il codice seguente:
ContentResolver cr = getContentResolver();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Content Providers (7/7)Gli oggetti ContentResolver permettono le interrogazioni attraverso il metodo queryquery() o col metodo managedQuerymanagedQuery() nel caso di una Activity
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla Rubrica (1/4)
// API 2import android.provider.ContactsContract.Contacts;
// istanzio un oggetto ContentResolverContentResolver cr = this.getContentResolver();
// la uri che identifica il tipo di contenutoUri uri = Contacts.CONTENT_URI;
// nomi delle colonne da includere nella rispostaString[] projection = {Contacts.DISPLAY_NAME};
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla Rubrica (2/4)// è la clausola WHERE (null=tutte le righe disponibili)String selection = null;
// lista degli argomenti della clausola WHEREString[] selectionArgs = null;
// è la clausola di ordinamentoString sortOrder = Contacts.DISPLAY_NAME + " ASC";
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla Rubrica (3/4)// ottengo un oggetto di tipo CursorCursor cursor = cr.query(uri, projection, selection, selectionArgs, sortOrder);
// ciclo di lettura dei contattiwhile (cursor.moveToNext()) {
String displayName = cursor.getString(0);// visualizza displayName
}
// chiusura del cursorecursor.close();
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Esecuzione di una query sulla Rubrica (4/4)<manifest ...>
... <uses-permission
android:name="android.permission.READ_CONTACTS"></uses-permission>
</manifest>
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
AndroidManifest.xml
Inserimento di un contatto
// ottengo un oggetto ContentResolverContentResolver cr = this.getContentResolver();
// definisco una “mappa” ContentValues values = new ContentValues();
// Uri relativo ai contattiUri contacts = People.CONTENT_URI;
// aggiungo il nome alla mappavalues.put(People.NAME, "Paolo");
// inserisco il nuovo contattoUri uri = cr.insert(contacts, values);
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Scrittura del record
Aggiornamento di un contatto
// ottengo l'uri del contattoUri phoneUri = Uri.withAppendedPath(uri,
People.Phones.CONTENT_DIRECTORY);
// inserisco il telefonovalues.clear();values.put(People.Phones.TYPE,
People.Phones.TYPE_MOBILE);values.put(People.Phones.NUMBER, "1233214567");cr.insert(phoneUri, values);
// analogamente si procede per l'email
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Modifica del record
Cancellazione di un contatto
“To delete a single record, call ContentResolver.delete() with the URI of a specific row”
“To delete multiple rows, call ContentResolver.delete() with the URI of the type of record to delete”
Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.
Da fare
Corso Base
Maurizio Cozzetto, Francesco Sarasini
5 minuti di pausa