LAP 2 Lezione 8: Properties, Database, Media, Filesystem
-
Upload
antonio-calanducci -
Category
Engineering
-
view
289 -
download
5
Transcript of LAP 2 Lezione 8: Properties, Database, Media, Filesystem
![Page 1: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/1.jpg)
Prof. Antonio S. Calanducci
20 May 2016
Prof. Antonio S. Calanducci Corso di Laurea in Informatica, Unict
Laboratorio Avanzato di Programmazione II
Lesson 8: Properties, Database, Media, Filesystem
![Page 2: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/2.jpg)
Meccanismi di persistenzaPermette di salvare i dati dell'app tra una esecuzione e l'altra Due metodi: • Properties API (Titanium.App.Properties)
• utile per salvare semplici coppie chiave-valore • tipi consentiti (Bool, Double, Int, List, String)
• Database API (Titanium.Database) da usare quando si hanno la complessità aumenta per informazioni strutturate SQLite (db in un file)
![Page 3: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/3.jpg)
Properties APISalvare una property: • Titanium.App.Properties.setString("username","tcaland")
;
• Titanium.App.Properties.setInt("LastScore", 1434);
• Titanium.App.Properties.setBool("completed",false);
• Titanium.App.Properties.setList("todolist",todoList);
Leggere una property: • var user =
Titanium.App.Properties.getString("username",”guest”);
• var todoList = Titanium.App.Properties.getList("todolist",[]);
![Page 4: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/4.jpg)
Hands-onModifichiamo la nostra applicazione To Do List aggiungendo la property
• todolist di tipo List
che viene caricata ad ogni avvio dell'app
riscritta ogni volta che viene aggiunta una nuova to do
![Page 5: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/5.jpg)
Database APISia iOS che Android hanno il supporto nativo a SQLite
• un database contenuto in un file
Un DB è utile quando:
• dati da gestire ben strutturati
• grandi quantità di dati (> 20 oggetti --> altrimenti usiamo le Properties)
Possibile importare database esistenti con:
• var db = Titanium.Database.install(path_db, name);
il file .sql deve stare dentro la cartella Resource
![Page 6: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/6.jpg)
Database APICreazione (o apertura di un database):
• var db = Titanium.Database.open(nome_database);
Chiusura di un db:
• db.close();
Esecuzione di una query SQL:
• var result = db.execute("SELECT * FROM toDoList");
• restituisce un oggetto Ti.Database.ResultSet
![Page 7: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/7.jpg)
Gestione dei ResultSetAccesso ai campi del ResultSet:
• var l = result.fieldByName("Location");
• var dueDate = result.fieldByName("data");
Scorrere in avanti il resultSet:
• result.next()
• restituisce falso se non ci sono altri records
• la property result.rowCount restituisce il numero di righe
• il metodo result.isValidRow() restituisce vero se la riga è valida
![Page 8: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/8.jpg)
Refresh di SQLCreazione di una nuova tabella:
• CREATE TABLE IF NOT EXISTS todos(id INTEGER PRIMARY KEY, title TEXT, location TEXT, alarm INTEGER, dueDate TEXT)
• Tipi supportati: INTEGER, REAL, TEXT, BLOB, NULL
Inserimento di un record in una tabella:
• INSERT INTO todos(title,location,alarm, dueDate) VALUES ('Pane','Panificio',0,'June 7,2011')
Cancellazione di un record in una tabella:
• DELETE FROM todos WHERE id=5
![Page 9: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/9.jpg)
Refresh di SQLAggiornamento di un campo in un record esistente:
• UPDATE todos SET alarm=1 WHERE id=5
Ricerca con condizioni:
• SELECT * FROM todos WHERE title LIKE "Pane%" AND alarm=0
![Page 10: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/10.jpg)
Passaggio parametri a SQLNon sempre sappiamo a priori quali sono i valori da inserire in un record:
• possiamo utilizzare il placeholder (segnaposto) ? che poi verrà sostituito dal valore di una variabile
• da usare con db.execute
Es:
• db.execute("INSERT INTO todos(title, location, alarm, dueDate) VALUES (?, ?, ?, ?)", todo.title, todo.location, todo.alarm, todo.dueDate)
![Page 11: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/11.jpg)
Esempiovar db = Ti.Database.open("ToDoDB");db.execute("CREATE TABLE IF NOT EXISTS todos(id INTEGER PRIMARY KEY, title TEXT, location TEXT, alarm INTEGER, dueDate TEXT)");var result = db.execute("SELECT * FROM todos");for (var i=0, j=result.rowCount ; i < j; i++) {
var todo = {};todo.title = result.fieldByName("title");todo.location = result.fieldByName("location");todo.alarm = result.fieldByName("alarm");todo.dueDate = result.fieldByName("dueDate");todo.hasChild = true;toDoList.push(todo);result.next();
}db.close();
![Page 12: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/12.jpg)
Hands onModifichiamo la nostra to do list con le API per i database:
• apriamo all'avvio il database ToDoDB
• creiamo la tabella todos se nn esiste già
• leggiamo tutti i record della tabella todos e popoliamo l'array (locale) toDoList (che è il datasource della nostra TableView)
• ogni volta che aggiungiamo una nuova to do, aggiungiamo un record al nostro database con il comando INSERT
• https://gist.github.com/1408643
![Page 13: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/13.jpg)
Accedere a Camera/GalleryLa maggior parte dei dispositivi mobili iOS/Android dispongono di una Photo/VideoCamera che permette il salvataggio di photo e video nella Gallery
Titanium ha API che permettono di accedere alla photo camera e alla gallery (quasi identiche):
![Page 14: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/14.jpg)
Media APIsTitanium.Media.showCamera(object)
Titanium.Media.openPhotoGallery(object)
object: dizionario con le seguenti property:
• success : function() chiamata quando la foto è stata scattata/selezionata
• error: function() in caso di errore
• cancel: function() se l'utente annulla
• saveToPhotoGallery: booleano, salva la foto in gallery
• allowEditing: booleano, se l'utente può ridimensionare
![Page 15: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/15.jpg)
Esempiovar foto = Ti.UI.createImageView({
image: "todo.png",width: 120,height: 120,top: 200
});
foto.addEventListener('click', function(e) {Ti.Media.openPhotoGallery({
success: function(e) {foto.image = e.media;
},cancel: function() {},error: function() { /* gestisci l'errore */},allowEditing: true
});});
![Page 16: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/16.jpg)
Salvataggio su file systemE' possibile leggere e scrivere sul file system local del dispositivo:
• es. salvataggio di file remoti
• oggetti multimediali (video, foto, audio)
tramite le API Ti.Filesystem
Es. di scrittura: var f = Ti.Filesystem.getFile(Ti.Filesystem.applicationDataDirectory, 'foto.jpg');
f.write(foto.image);
![Page 17: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/17.jpg)
Storage LocationsTi.Filesystem.applicationDataDirectory (read/write)
Ti.Filesystem.resourcesDirectory (read-only)
Ti.Filesystem.tempDirectory (read-write)
Ti.Filesystem.externalStorageDirectory (read-write)
![Page 18: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/18.jpg)
Hands-onAggiungere una ImageView alla toDo List
Al click sulla ImageView sarà possibile selezionare una photo dalla Gallery (o dalla Camera se eseguito su dispositivo)
L'immagine sarà salvata sul file system locale
Verrà aggiunto nel db un nuovo campo URL, che contiene il nome dell'immagine appena salvata
Modificare il codice affinchè al riavvio dell'app venga recuperata correttamente l'immagine dal filesystem e visualizzata sulla ImageView
![Page 19: LAP 2 Lezione 8: Properties, Database, Media, Filesystem](https://reader031.fdocuments.us/reader031/viewer/2022030308/58ee525e1a28abc2428b46a5/html5/thumbnails/19.jpg)
Question