AA 2014/15 SQLite DB 2013/14 Programmazione di disposi8vi mobili -­‐ v1.1 1 SQLite3 •  Libreria da usare in un programma –  hCps://www.sqlite.org/ –  in android è installata •  Installare ed usare sulla shell –  Tante UI – da NON usare J •  hCp://sqlitestudio.pl/ Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 2 1 AA 2014/15 Database relazionali •  Da8 raccol8 in tabelle non ordinate: relazioni –  colonne: campi, aCribu8, fields –  righe: tuple, records Utenti (CF, nome, cognome)
CF
nome
cognome
BNCFR... Franco
Bianchi
VRDGS... Giuseppe Verdi
RSSMR... Mario
Rossi
Libri (ISBN, autore, titolo)
ISBN
autore
titolo
111111111
Caroll
Alice in W
22222222
Tanenbaum Reti di Calc
33333333
AA. VV.
Lonely Plan
44444444
Hofstadter
GEB-EGB
Prestiti (utente, libro, dataPrestito, dataRestituzione)
utente
libro
dataPrestito
dataRestituzione
RSSMR...
22222222
12/12/2012
-
VRDGS...
44444444
01/10/2011
11/11/2011
2014-­‐2015 Programmazione Web 3 Vincoli di integrità •  Evitano che vengano inserite informazioni "non possibili" –  Esistono da8 che sono sintaVcamente correV ma non rappresentano informazioni possibili per l’applicazione di interesse •  Vincoli di dominio –  8po di dato ammesso per un campo •  Chiavi primarie –  Insieme di aCribu8 che iden8ficano univocamente le tuple di una relazione •  Vincoli di tupla –  relazioni interne fra i da8 •  Vincoli di integrità̀ referenziale –  Fanno riferimento a chiavi primarie su altre relazioni –  SoddisfaV se valore esiste nell'altra relazione 2014-­‐2015 Programmazione Java per Disposi8vi Mobili Programmazione Web 4 2 AA 2014/15 Vincoli di dominio •  Tipi di dato che uso per le diverse colonne •  Il codice fiscale ha il suo formato Libri (ISBN, autore, titolo)
Utenti (CF, nome, cognome)
CF
nome
cognome
BNCFR... Franco
Bianchi
VRDGS... Giuseppe Verdi
RSSMR... Mario
Rossi
Devono esistere ISBN
autore
titolo
111111111
Caroll
Alice in W
22222222
Tanenbaum Reti di Calc
33333333
AA. VV.
Lonely Plan
44444444
Hofstadter
GEB-EGB
Prestiti (utente, libro, dataPrestito, dataRestituzione)
utente
libro
dataPrestito
dataRestituzione
RSSMR...
22222222
12/12/2012
-
VRDGS...
44444444
01/10/2011
11/11/2011
2014-­‐2015 Programmazione Web 5 Chiavi Primarie • 
• 
• 
• 
Insieme di aCribu8 che iden8ficano univocamente le tuple di una relazione Almeno una per ogni relazione Possono essere definite su più aCribu8 Se non esiste una chiave, va definita (es. valore incrementale) Libri (ISBN, autore, titolo)
Utenti (CF, nome, cognome)
CF
nome
cognome
BNCFR... Franco
Bianchi
VRDGS... Giuseppe Verdi
RSSMR... Mario
Rossi
Devono esistere ISBN
autore
titolo
111111111
Caroll
Alice in W
22222222
Tanenbaum Reti di Calc
33333333
AA. VV.
Lonely Plan
44444444
Hofstadter
GEB-EGB
Prestiti (utente, libro, dataPrestito, dataRestituzione)
utente
libro
dataPrestito
dataRestituzione
RSSMR...
22222222
12/12/2012
-
VRDGS...
44444444
01/10/2011
11/11/2011
2014-­‐2015 Programmazione Java per Disposi8vi Mobili Programmazione Web 6 3 AA 2014/15 Vincoli di tupla •  dataPres8to < dataRes8tuzione Libri (ISBN, autore, titolo)
Utenti (CF, nome, cognome)
CF
nome
cognome
BNCFR... Franco
Bianchi
VRDGS... Giuseppe Verdi
RSSMR... Mario
Rossi
Devono esistere ISBN
autore
titolo
111111111
Caroll
Alice in W
22222222
Tanenbaum Reti di Calc
33333333
AA. VV.
Lonely Plan
44444444
Hofstadter
GEB-EGB
Prestiti (utente, libro, dataPrestito, dataRestituzione)
utente
libro
dataPrestito
dataRestituzione
RSSMR...
22222222
12/12/2012
-
VRDGS...
44444444
01/10/2011
11/11/2011
2014-­‐2015 Programmazione Web 7 Vincoli di integrità referenziale •  Fanno riferimento a chiavi primarie su altre relazioni •  SoddisfaV se valore esiste nell'altra relazione Libri (ISBN, autore, titolo)
Utenti (CF, nome, cognome)
CF
nome
cognome
BNCFR... Franco
Bianchi
VRDGS... Giuseppe Verdi
RSSMR... Mario
Rossi
Devono esistere ISBN
autore
titolo
111111111
Caroll
Alice in W
22222222
Tanenbaum Reti di Calc
33333333
AA. VV.
Lonely Plan
44444444
Hofstadter
GEB-EGB
Prestiti (utente, libro, dataPrestito, dataRestituzione)
utente
libro
dataPrestito
dataRestituzione
RSSMR...
22222222
12/12/2012
-
VRDGS...
44444444
01/10/2011
11/11/2011
2014-­‐2015 Programmazione Java per Disposi8vi Mobili Programmazione Web 8 4 AA 2014/15 Esercizio •  comandi sql Programmazione Java per Disposi8vi Mobili 9 Programmazione Java per Disposi8vi Mobili 10 Programmazione Java per Disposi8vi Mobili 5 AA 2014/15 Database locale •  Le app possono creare un db locale per memorizzare i da8 •  Il db è SQLite –  libreria per ges8re un db in un file •  Path db /data/data/<your.package.name>/databases/<database-­‐name>.db Programmazione Java per Disposi8vi Mobili 11 SQLiteDatabase •  android.database.sqlite.SQLiteDatabase •  Apertura db –  ma anche da context •  Interfaccia db –  SQL raw •  execSQL – create update e delete •  rawQuery – retrive –  Metodi specifici •  insert, query, update, delete Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 12 6 AA 2014/15 Apertura DB •  openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler) –  This method only opens the exis8ng database with the appropriate flag mode. The common flags mode could be OPEN_READWRITE OPEN_READONLY •  openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags) –  It is similar to the above method as it also opens the exisi8ng database but it does not define any handler to handle the errors of databases •  openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) –  It not only opens but create the datbase if it not exists. This method is equivalent to openDatabase method •  openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory) –  This method is similar to above method but it takes the File object as a path rather then a string. It is equavilent to file.getPath() Programmazione Java per Disposi8vi Mobili 13 execSQL Usato per inserire da8 ma anche modificare il db o cancellare righe. "Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data" mydatabase.execSQL("CREATE TABLE IF NOT EXISTS Uten8(nomeVARCHAR,passwordVARCHAR);"); mydatabase.execSQL("INSERT INTO Uten8 VALUES('admin','admin');");
•  execSQL(String sql) Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 14 7 AA 2014/15 rowQuery String q = "SELECT * FROM Uten8"; Cursor mCursor = mDb.rawQuery(q, null); q = "SELECT * FROM Uten8 WHERE nome = 'admin'" ; mCursor = mDb.rawQuery(q, null); q = "SELECT nome FROM Uten8 WHERE nome = ? AND password = ?" mCursor = mDb.rawQuery(q, new String[] {"admin", "wrwerwer"}); Programmazione Java per Disposi8vi Mobili 15 Cursor •  Iteratore su una tabella di valori –  Result Set Metodi –  cursor.moveToFirst() –  cursor.moveToNext() –  cursor.getString(0) –  cursor.getInt(1) Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 16 8 AA 2014/15 esempio String q= "SELECT * FROM Uten8"; SQLiteDatabase db = ... Cursor cursor = db.rawQuery(q, null); if (cursor.moveToFirst()) { do { int id = cursor.getInt(0); String name cursor.getString(1); ... } while (cursor.moveToNext()); } Programmazione Java per Disposi8vi Mobili 17 Metodi di cursor •  getColumnCount() –  This method return the total number of columns of the table. •  getColumnIndex(String columnName) –  This method returns the index number of a column by specifying the name of the column •  getColumnName(int columnIndex) –  This method returns the name of the column by specifying the index of the column •  getColumnNames() –  This method returns the array of all the column names of the table. •  getCount() –  This method returns the total number of rows in the cursor •  getPosi8on() –  This method returns the current posi8on of the cursor in the table •  isClosed() –  This method returns true if the cursor is closed and return false otherwise Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 18 9 AA 2014/15 insert SQLiteDatabase db = ... ContentValues contentValues = new ContentValues(); contentValues.put("nome","pier"); contentValues.put("password","hksksj"); db.insert("Uten8",null,contentValues); Programmazione Java per Disposi8vi Mobili 19 Programmazione Java per Disposi8vi Mobili 20 Programmazione Java per Disposi8vi Mobili 10 AA 2014/15 SQLiteOpenHelper •  Classe di u8lità per ges8re DB •  Metodi –  onCreate(SQLiteDatabase) –  onUpgrade(SQLiteDatabase, int, int) –  onOpen(SQLiteDatabase) -­‐ opzionale –  getReadableDatabase() •  Create and/or open a database. –  getWritableDatabase() •  Create and/or open a database that will be used for reading and wri8ng. Programmazione Java per Disposi8vi Mobili 21 SQLiteOpenHelper public class DBHelper extends SQLiteOpenHelper { public DBHelper(){ super(context,DATABASE_NAME,null,1); } public void onCreate(SQLiteDatabase db) { .... } public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { ... } } Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 22 11 AA 2014/15 DBHelperSingleton public class DBHelperSingleton extends SQLiteOpenHelper { private sta8c DBHelperSingleton sInstance; private sta8c final String DATABASE_NAME = "database_name"; private sta8c final String DATABASE_TABLE = "table_name"; private sta8c final int DATABASE_VERSION = 1; public sta8c synchronized DBHelperSingleton getInstance(Context context) { if (sInstance == null) { sInstance = new DBHelperSingleton(context.getApplica8onContext()); } return sInstance; } private DBHelperSingleton (Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } ... } Programmazione Java per Disposi8vi Mobili Programmazione Java per Disposi8vi Mobili 23 12