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