Giornata Tecnica da Piave Servizi, 11 aprile 2024 | ALBIERO Andrea
LAP 2 Lezione 8: Properties, Database, Media, Filesystem
1. 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
2. Meccanismi di persistenza
Permette 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)
3. Properties API
Salvare 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",[]);
4. Hands-on
Modifichiamo 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
5. Database API
Sia 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
6. Database API
Creazione (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
7. Gestione dei ResultSet
Accesso 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
8. Refresh di SQL
Creazione 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
9. Refresh di SQL
Aggiornamento 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
10. Passaggio parametri a SQL
Non 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)
11. Esempio
var 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();
12. Hands on
Modifichiamo 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
13. Accedere a Camera/Gallery
La 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):
16. Salvataggio su file system
E' 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);
18. Hands-on
Aggiungere 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