lezione 6 - mauriziocozzetto.net · programmare sqlite (1/4) import...

31
Corso Base Maurizio Cozzetto, Francesco Sarasini Lezione 6

Upload: dotruc

Post on 25-Feb-2019

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

Corso Base

Maurizio Cozzetto, Francesco Sarasini

Lezione 6

Page 2: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 3: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

Database SQLite (2/2)Bisogna estendere la classe SQLiteOpenHelperSQLiteOpenHelper e sovrascrivere i metodi onCreateonCreate() e onUpgradeonUpgrade()

Android Corso Base. Maurizio Cozzetto, Francesco Sarasini.

Page 4: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 5: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 6: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 7: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 8: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 9: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 10: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 11: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 12: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 13: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 14: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 15: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 16: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 17: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 18: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 19: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 20: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 21: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

...

Page 22: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 23: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 24: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 25: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 26: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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.

Page 27: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 28: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 29: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 30: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

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

Page 31: Lezione 6 - mauriziocozzetto.net · Programmare SQLite (1/4) import android.database.sqlite.SQLiteDatabase; ... Content Providers (6/7) Per interagire con il Content Provider che

Corso Base

Maurizio Cozzetto, Francesco Sarasini

5 minuti di pausa