{"id":3469,"date":"2010-05-24T15:38:25","date_gmt":"2010-05-24T13:38:25","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=3469"},"modified":"2010-05-24T15:38:25","modified_gmt":"2010-05-24T13:38:25","slug":"t044-come-implementare-un-database-sqlite-nelle-nostre-applicazioni","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t044-come-implementare-un-database-sqlite-nelle-nostre-applicazioni\/","title":{"rendered":"T#044 &#8211; Come implementare un database SQLite nelle nostre applicazioni"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14.png\" alt=\"T044 - Screenshot 14\" title=\"T044_screenshot_14\" width=\"52\" height=\"96\" class=\"alignleft size-full wp-image-3485\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14-161x300.png 161w\" sizes=\"auto, (max-width: 52px) 100vw, 52px\" \/><\/a> Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone SDK. Oggi vedremo come <strong>implementare un database SQL con SQLite<\/strong> all&#8217;interno delle nostre applicazioni. Il database sar\u00e0 molto semplice, creeremo infatti un&#8217;unica tabella che conterr\u00e0 un elenco di nomi di persone. Questi record (ovvero i nomi salvati nel database) verranno mostrati successivamente in una TableView all&#8217;interno della nostra applicazione. Vedremo quindi anche come interrogare il nostro database con una semplicissima query.<!--more--><\/p>\n<p>Devo premettere, per\u00f2, che non parler\u00f2 di SQL e database relazionali, i quali devono essere gi\u00e0 conosciuti da chi affronta questo tutorial. \u00c8 una scelta che potrebbe sicuramente non piacere a molti di voi, ci\u00f2 nonostante capirete che una trattazione completa sull&#8217;argomento richiederebbe troppo tempo e non potrebbe essere certo proposta in un semplice tutorial pratico. Detto ci\u00f2, sappiate che potrete seguire il tutorial anche senza conoscere niente di SQL, ovviamente alcune caratteristiche e alcuni passaggi potrebbero risultare di difficile comprensione.<\/p>\n<p>In questo tutorial sentirete spesso parlare di SQLite, ma cosa \u00e8 di preciso?<\/p>\n<p>SQLite \u00e8 una libreria che implementa un DBMS (Database Management System) SQL, permettendo di creare un database all&#8217;interno di un unico file. Esso \u00e8 molto indicato per scopi come il nostro, ovvero la creazione di semplici applicazioni per dispositivi mobili, che non possono permettersi di avere un DMBS dedicato per la gestione delle basi di dati. SQLite fornisce un supporto parziale all&#8217;SQL, in quanto manca di alcune caratteristiche avanzate, presenti invece in DBMS pi\u00f9 evoluti. SQLite \u00e8 comunque molto veloce e leggero, perfetto quindi per le applicazioni per iPhone.<\/p>\n<h4>Creiamo un nuovo progetto e la struttura necessaria<\/h4>\n<p>Iniziamo creando un nuovo progetto di tipo &#8220;Navigation-based Application&#8221; e chiamiamolo &#8220;sqlTutorial&#8221;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_01.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_01.png\" alt=\"T044 - Screenshot 01\" title=\"T044_screenshot_01\" width=\"500\" height=\"415\" class=\"aligncenter size-full wp-image-3472\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_01.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_01-300x249.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_01-150x124.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo quindi creato un progetto che ci fornisce gi\u00e0 l&#8217;implementazione di una tabella, che useremo per visualizzare i dati letti dal nostro database.<\/p>\n<p>Dobbiamo, per\u00f2, inserire altre due cose molto importanti:<\/p>\n<ul>\n<li>una classe che si occuper\u00e0 di comunicare con il database<\/li>\n<li>la libreria che permette tale comunicazione<\/li>\n<\/ul>\n<p>Iniziamo a creare la classe che servir\u00e0 ai nostri scopi. Andiamo in &#8220;File -> New File\u2026&#8221; e creiamo una nuova &#8220;Objective-C class&#8221;, chiamiamola semplicemente &#8220;Data&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_02.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_02.png\" alt=\"T044 - Screenshot 02\" title=\"T044_screenshot_02\" width=\"500\" height=\"415\" class=\"aligncenter size-full wp-image-3473\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_02.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_02-300x249.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_02-150x124.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Dobbiamo ora inserire nel nostro progetto la libreria (o framework) che si occupa del collegamento con il database sql. Clicchiamo con il tasto destro sulla cartella &#8220;Frameworks&#8221; all&#8217;interno del nostro progetto, clicchiamo quindi su &#8220;Add -> Existing Frameworks\u2026&#8221; e dall&#8217;elenco che apparir\u00e0 selezioniamo &#8220;libsqlite3.0.dylib&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_03.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_03.png\" alt=\"T044 - Screenshot 03\" title=\"T044_screenshot_03\" width=\"352\" height=\"398\" class=\"aligncenter size-full wp-image-3474\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_03.png 352w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_03-265x300.png 265w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_03-132x150.png 132w\" sizes=\"auto, (max-width: 352px) 100vw, 352px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo cos\u00ec terminato la definizione della struttura principale del nostro progetto. Se avete eseguito tutto in maniera corretta dovreste avere un progetto simile a questo:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_04.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_04.png\" alt=\"T044 - Screenshot 04\" title=\"T044_screenshot_04\" width=\"247\" height=\"292\" class=\"aligncenter size-full wp-image-3475\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_04.png 247w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_04-126x150.png 126w\" sizes=\"auto, (max-width: 247px) 100vw, 247px\" \/><\/a><br \/>\n<\/center><\/p>\n<h4>2) Definiamo la classe &#8220;Data&#8221;<\/h4>\n<p>Dobbiamo ora implementare la classe &#8220;Data&#8221;, su cui si basa gran parte di questo tutorial. Prima di iniziare a scrivere codice, focalizziamo l&#8217;attenzione su ci\u00f2 che deve fare questa classe. Essa avr\u00e0 il compito di:<\/p>\n<ul>\n<li>creare una connessione con il database (di cui noi specificheremo un indirizzo, in questo caso locale, ma nulla vieterebbe di avere un database in remoto);<\/li>\n<li>interrogare la base di dati eseguendo una query impostata via codice;<\/li>\n<li>inserire i risultati della query all&#8217;interno di un&#8217;array, che verr\u00e0 poi utilizzato per mostrare i dati all&#8217;interno della tabella;<\/li>\n<\/ul>\n<p>Vediamo ora di implementare queste funzionalit\u00e0, pi\u00f9 altre caratteristiche che ci serviranno come supporto.<\/p>\n<p>Iniziamo aprendo il file &#8220;Data.h&#8221;. Apriamolo e inseriamo al suo interno il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <Foundation\/Foundation.h>\r\n#import <sqlite3.h>\r\n \r\n@interface Data : NSObject {\r\n   \/\/ Lista contenente i dati letti dal database\r\n   NSMutableArray *lista;\r\n}\r\n \r\n- (id)init:(NSString *)pathDB;\r\n- (void)caricaValoriDaDB:(NSString *)dbPath;\r\n- (unsigned)getSize;\r\n- (id)objectAtIndex:(unsigned)theIndex;\r\n \r\n@property (nonatomic, retain) NSMutableArray *lista;\r\n \r\n@end\r\n<\/pre>\n<p>Alla riga numero 6 abbiamo dichiarato un array (di tipo NSMutableArray, quindi modificabile anche dopo la sua inizializzazione), che conterr\u00e0 i valori letti dal database.  Dalla riga 9 alla 12 abbiamo invece definito i metodi che ci serviranno in questa classe, che implementeremo fra poco nel rispettivo file .m. Da notare, inoltre, la classe importata alla riga 2: \u00e8 necessaria per dire alla nostra classe di utilizzare la libreria che abbiamo importato ad inizio della guida.<\/p>\n<p>Apriamo ora il file &#8220;Data.m&#8221; e modifichiamo il suo codice come segue:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"Data.h\"\r\n \r\nstatic sqlite3 *database = nil;\r\n \r\n@implementation Data\r\n \r\n@synthesize lista;\r\n \r\n\/\/ Inizializziamo l'oggetto della classe Data\r\n- (id)init:(NSString *)pathDB{\r\n    \/\/ carichiamo i valori dal database\r\n    [self caricaValoriDaDB:pathDB];\r\n    return self;\r\n}\r\n \r\n\/\/ Ritorna la dimensione della lista (n\u00b0 di elementi letti dal db)\r\n- (unsigned)getSize {\r\n    return [lista count];\r\n}\r\n \r\n\/\/ Ritorna l'oggetto ad una data posizione\r\n- (id)objectAtIndex:(unsigned)index {\r\n    return [lista objectAtIndex:index];\r\n}\r\n<\/pre>\n<p>La prima istruzione degna di nota compare alla riga 3, ed \u00e8 la definizione dell&#8217;oggetto che ci servir\u00e0 per creare la connessione con il database.<br \/>\nAlla riga 10, invece, viene dichiarato il primo metodo, &#8220;init&#8221;, che deve essere invocato quando si vuole inizializzare un oggetto appartenente alla classe Data. Alla riga 12 chiamiamo il metodo &#8220;caricaValoriDaDB&#8221;, che ha il compito di interfacciarsi con il database ed eseguire le query sui dati (vedremo fra poco la sua implementazione). Il &#8220;return self&#8221; alla riga 13, infine, ritorna il puntatore dell&#8217;oggetto appena creato.<\/p>\n<p>Alla riga 17 definiamo &#8220;getSize&#8221;, un semplice metodo che ci ritorna la dimensione della lista, e quindi <strong>il numero di elementi letti<\/strong> dalla nostra query. Questo ci servir\u00e0 quando andremo a definire la tabella.<\/p>\n<p>Infine, alla riga 22, definiamo un metodo che ci ritorna un oggetto presente ad una determinata posizione della nostra lista. Ad esempio, potremo recuperare il 5\u00b0 elemento della nostra lista, per poi elaborarlo oppure mostrarlo all&#8217;utente.<\/p>\n<p>Dobbiamo ora implementare il metodo pi\u00f9 complesso di questa classe, ovvero &#8220;caricaValoriDaDB&#8221;. Ecco il codice di tale metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/ Carica i valori dal database passato come parametro\r\n-(void)caricaValoriDaDB:(NSString *)dbPath {\r\n        \/\/ lista temporanea\r\n\tNSMutableArray *listaTemp = [[NSMutableArray alloc] init];\r\n\t\/\/ Oggetto che contiene i vari elementi\r\n        NSMutableDictionary *dictionary;\r\n \r\n\tNSMutableString *idPersona;\/\/id della persona\r\n\tNSMutableString *nome;\/\/nome della persona\r\n\tNSMutableString *cognome;\/\/cognome della persona\r\n \r\n\tif (sqlite3_open([dbPath UTF8String], &amp;database) == SQLITE_OK) {\r\n\t\t\/\/ query che ricava i valori\r\n\t\tconst char *sql = \"select ID, Nome, Cognome from PERSONA\";\r\n\t\tsqlite3_stmt *selectstmt;\r\n \r\n\t\tif(sqlite3_prepare_v2(database, sql, -1, &amp;selectstmt, NULL) == SQLITE_OK) {\r\n \r\n\t\t\twhile(sqlite3_step(selectstmt) == SQLITE_ROW) {\r\n\t\t\t\t\/\/ ricaviamo i valori letti dalla query\r\n\t\t\t\tidPersona = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];\r\n\t\t\t\tnome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];\r\n\t\t\t\tcognome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];\r\n\t\t\t\t\/\/ inseriamo tutti i valori letti in un unico oggetto\r\n\t\t\t\tdictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:idPersona, @\"id\", nome, @\"nome\", cognome, @\"cognome\", nil];\r\n \r\n\t\t\t\t[listaTemp addObject:dictionary];\r\n\t\t\t\t[dictionary release];\r\n\t\t\t}\r\n\t\t}\r\n\t\tself.lista = listaTemp;\r\n\t\t[listaTemp release];\r\n\t}\r\n\telse\r\n\t\tsqlite3_close(database);\r\n}\r\n<\/pre>\n<p>Iniziamo ad analizzare questo metodo. Partiamo dall&#8217;intestazione, in cui viene definito un parametro &#8220;dbPath&#8221;: questo \u00e8 il percorso del nostro database. Esso lo definiremo in seguito, nella classe che gestisce la tabella. In questo tutorial il database sar\u00e0 in locale, ovver\u00f2 sar\u00e0 fisicamente presente nella cartella del nostro progetto. Nulla vieta, comunque, di inserire un indirizzo, che ci consenta di connetterci ad un database presente su un server remoto.<\/p>\n<p>Subito dopo, creiamo alcuni oggetti, che ci servono per gestire i dati ricavati dalle query. Abbiamo, infatti, un oggetto &#8220;dictionary&#8221;, che conterr\u00e0 i vari elementi ricavati dall&#8217;interrogazione al database. Le stringhe &#8220;idPersona&#8221;, &#8220;nome&#8221;, &#8220;cognome&#8221;, infatti, servono per salvare i valori letti, e inserirli all&#8217;interno dell&#8217;oggetto appena menzionato.<\/p>\n<p>Alla riga 37 viene aperta la connessione con il database: essa si trova all&#8217;interno di un ciclo &#8220;if&#8221;: se tale controllo da esito positivo, si possono elaborare i dati, altrimenti si passa alla fine del metodo, in quanto non \u00e8 possibile instaurare una connessione con il database. Se la connessione \u00e8 stata creata, possiamo creare la query che andremo poi ad eseguire (riga 39). Alla riga 42 eseguiamo poi tale query: anche in questo caso, se l&#8217;esecuzione ha avuto successo, possiamo ricavare i valori desiderati, altrimenti non verr\u00e0 eseguita nessuna operazione.<\/p>\n<p>Il ciclo while (riga 44) ci permetter\u00e0 di scorrere tutti i risultati della nostra query (che potrebbero essere, ovviamente, pi\u00f9 di uno), fino al termine. Potete notare che i risultati vengono inseriti in un oggetto di tipo &#8220;NSMutableDictionary&#8221;: esso \u00e8 come un grande contenitore, che ci permette di inserire valori associandoci un tag (quello che facciamo alla riga 50).<\/p>\n<p>Come vedete non si tratta di operazioni complesse, si tratta solo di capire come funziona il meccanismo, che potete poi variare a seconda delle vostre esigenze.<\/p>\n<p>Gli ultimi due metodi da inserire nel file &#8220;Data.m&#8221; sono i seguenti:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n+(void)finalizeStatements {\r\n\tif(database)\r\n\t\tsqlite3_close(database);\r\n}\r\n \r\n-(void)dealloc {\r\n\t[lista release];\r\n\t[super dealloc];\r\n}\r\n<\/pre>\n<p>Il primo si occupa di concludere la query e di chiudere la connessione al database (va sempre messo), mentre il secondo \u00e8 il classico &#8220;dealloc&#8221;.<\/p>\n<p>Abbiamo concluso con la definizione della classe &#8220;Data&#8221;. Vediamo ora come creare il nostro database e inserirlo nel progetto.<\/p>\n<h4>3) Creiamo il database SQLite<\/h4>\n<p>Quello che dobbiamo andare a realizzare ora \u00e8 un semplice database, con tecnologia SQLite. Possiamo lavorare da Terminale, per semplificarvi un po&#8217; la vita, per\u00f2, vi faremo vedere come crearlo utilizzando un plug-in per Firefox, chiamato &#8220;<strong>SQLite Manager<\/strong>&#8220;, che potete trovare a <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/5817\/\" target=\"_blank\">questo indirizzo<\/a>. In alternativa esistono alcuni programmi dedicati, come <a href=\"http:\/\/www.sqlabs.com\/sqlitemanager.php\" target=\"_blank\">SQLiteManager<\/a>, che \u00e8, per\u00f2, a pagamento.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_05.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_05.png\" alt=\"T044 - Screenshot 05\" title=\"T044_screenshot_05\" width=\"845\" height=\"554\" class=\"aligncenter size-full wp-image-3476\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_05.png 845w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_05-300x196.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_05-150x98.png 150w\" sizes=\"auto, (max-width: 845px) 100vw, 845px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Dopo aver installato l&#8217;estensione, andiamo in &#8220;Strumenti -> SQLite Manager&#8221;, si avvier\u00e0 il tool che ci permetter\u00e0 di creare il nostro database. Clicchiamo sull&#8217;icona del foglio bianco per crare un nuovo database:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_06.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_06.png\" alt=\"T044 - Screenshot 06\" title=\"T044_screenshot_06\" width=\"500\" height=\"297\" class=\"aligncenter size-full wp-image-3477\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_06.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_06-300x178.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_06-150x89.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>e inseriamo &#8220;persone&#8221; come nome per il file:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_07.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_07.png\" alt=\"T044 - Screenshot 07\" title=\"T044_screenshot_07\" width=\"490\" height=\"186\" class=\"aligncenter size-full wp-image-3478\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_07.png 490w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_07-300x113.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_07-150x56.png 150w\" sizes=\"auto, (max-width: 490px) 100vw, 490px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Scegliamo ora dove salvare il file (vi consiglio sulla Scrivania, cos\u00ec potrete recuperarlo celermente in seguito).<\/p>\n<p>Abbiamo cos\u00ec creato il nostro database, che risulta per\u00f2 essere completamente vuoto. Dobbiamo, quindi, creare al suo interno la tabella &#8220;Persone&#8221;. Per fare ci\u00f2, facciamo clic con il tasto destro su &#8220;Tables&#8221; che troviamo nella parte sinistra della schermata, e selezioniamo &#8220;Create Table&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_08.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_08.png\" alt=\"T044 - Screenshot 08\" title=\"T044_screenshot_08\" width=\"350\" height=\"227\" class=\"aligncenter size-full wp-image-3479\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_08.png 350w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_08-300x194.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_08-150x97.png 150w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Si aprir\u00e0 una nuova schermata, in cui dovremo definire gli attributi della tabella. Ecco cosa dobbiamo inserire:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_09.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_09.png\" alt=\"T044 - Screenshot 09\" title=\"T044_screenshot_09\" width=\"649\" height=\"492\" class=\"aligncenter size-full wp-image-3480\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_09.png 649w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_09-300x227.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_09-150x113.png 150w\" sizes=\"auto, (max-width: 649px) 100vw, 649px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Clicchiamo su &#8220;Ok&#8221; e su &#8220;Yes&#8221; nel messaggio successivo che apparir\u00e0.<\/p>\n<p>Abbiamo inserito gli attributi necessari, ovvero <em>nome<\/em>, <em>cognome<\/em> e un identificativo univoco (<em>id<\/em>).<br \/>\nNon ci resta che inserire dei valori nella nostra tabella. Per fare ci\u00f2, andiamo nella sezione &#8220;Execute SQL&#8221; e inseriamo le seguenti istruzione:<\/p>\n<pre lang=\"sql\" line=\"1\" escaped=\"true\">\r\nINSERT INTO PERSONA (id,Nome,Cognome) VALUES ('1','Giovanni','Verdi');\r\nINSERT INTO PERSONA (id,Nome,Cognome) VALUES ('2','Paolo','Rossi');\r\nINSERT INTO PERSONA (id,Nome,Cognome) VALUES ('3','Luca','Bianchi');\r\nINSERT INTO PERSONA (id,Nome,Cognome) VALUES ('4','Andrea','Busi');\r\n<\/pre>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_10.png\" alt=\"T044 - Screenshot 10\" title=\"T044_screenshot_10\" width=\"500\" height=\"238\" class=\"aligncenter size-full wp-image-3481\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_10.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_10-300x142.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_10-150x71.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Un messaggio in &#8220;Last Error&#8221; ci comunicher\u00e0 se vi sono stati errori nell&#8217;inserimento dei dati, oppure se tutto \u00e8 andato per il verso giusto.<\/p>\n<p>Possiamo, infine, controllare i valori che abbiamo inserito, spostandoci nella sezione &#8220;Browse &#038; Search&#8221;:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_11.png\" alt=\"T044 - Screenshot 11\" title=\"T044_screenshot_11\" width=\"500\" height=\"238\" class=\"aligncenter size-full wp-image-3482\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_11.png 500w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_11-300x142.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_11-150x71.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Abbiamo concluso! Chiudiamo il programmino e firefox, i cambiamenti sono gi\u00e0 stati apportati al nostro database.<\/p>\n<h4>4) Concludiamo l&#8217;applicazione<\/h4>\n<p>Torniamo ora ad XCode, e concludiamo lo sviluppo della nostra applicazione. Per prima cosa, dobbiamo inserire fisicamente il database che abbiamo creato all&#8217;interno del nostro progetto. Trasciniamo quindi il file all&#8217;interno di XCode:<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_12.png\" alt=\"T044 - Screenshot 12\" title=\"T044_screenshot_12\" width=\"819\" height=\"509\" class=\"aligncenter size-full wp-image-3483\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_12.png 819w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_12-300x186.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_12-150x93.png 150w\" sizes=\"auto, (max-width: 819px) 100vw, 819px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Nella schermata che apparir\u00e0 inseriamo la spunta su &#8220;Copy items into destination group&#8217;s folder&#8221; e clicchiamo su &#8220;Add&#8221;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_13.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_13.png\" alt=\"T044 - Screenshot 13\" title=\"T044_screenshot_13\" width=\"414\" height=\"388\" class=\"aligncenter size-full wp-image-3484\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_13.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_13-300x281.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_13-150x140.png 150w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><br \/>\n<\/center><\/p>\n<p>Siamo pronti per completare la nostra applicazione. Apriamo il file &#8220;RootViewController.h&#8221; e inseriamo il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import \"Data.h\"\r\n \r\n@interface RootViewController : UITableViewController {\r\n \/\/ Oggetto con la lista degli elementi letti dal db\r\n Data *dataList;\r\n}\r\n\r\n@end\r\n<\/pre>\n<p>Alla riga 5 abbiamo dichiarato la lista che conterr\u00e0 gli elementi letti dal database. Per capirci, \u00e8 quella che viene creata dal metodo &#8220;caricaValoriDaDB&#8221;, che abbiamo definito in precedenza.<\/p>\n<p>Passiamo ora al file &#8220;RootViewController.m&#8221;. Iniziamo con il metodo &#8220;viewDidLoad&#8221;, che, come ormai dovreste sapere, ci consente di eseguire delle operazioni al caricamento dell&#8217;applicazione. Ecco come dobbiamo modificare tale metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)viewDidLoad {\r\n    [super viewDidLoad];\r\n \r\n\tself.title = @\"Lista Autori\";\r\n\t\/\/leggiamo il path del database\r\n\tNSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@\"persone.sqlite\"];\r\n \r\n\t\/\/creiamo la lista degli autori\r\n\tdataList = [[Data alloc] init:defaultDBPath];\r\n}\r\n<\/pre>\n<p>Alla riga 4 impostiamo il titolo della nostra tabella, mentre alla riga 6 definiamo il percorso del nostro database. A prima vista pu\u00f2 sembrare complessa, ma essa non fa altro che rilevare il percorso in cui si trova l&#8217;applicazione (sia essa su iPhone Simulator che su iPhone fisico) e aggiungere a tale percorso &#8220;persone.sqlite&#8221;, che \u00e8 proprio il database che abbiamo inserito nel nostro progetto.<br \/>\nAlla riga 9, infine, inizializziamo la lista, passando alla funzione &#8220;init&#8221; proprio il percorso che abbiamo definito poche righe sopra.<\/p>\n<p>Dobbiamo, ora, definire i metodi necessari per settare la tabella. Abbiamo gi\u00e0 visto questi metodi nei tutorial dedicati alle tableView, quindi non mi soffermer\u00f2 troppo sulla spiegazione. Sempre all&#8217;interno del file &#8220;RootViewController.m&#8221;, andiamo verso il fondo, e cerchiamo i metodi del protocollo UITableView, che dovremo completare nel seguente modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#pragma mark Table view methods\r\n \r\n- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {\r\n    return 1;\r\n}\r\n \r\n\/\/ Customize the number of rows in the table view.\r\n- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {\r\n    return [dataList getSize];\r\n}\r\n \r\n\/\/ Customize the appearance of table view cells.\r\n- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {\r\n \r\n    static NSString *CellIdentifier = @\"Cell\";\r\n \r\n    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];\r\n    if (cell == nil) {\r\n        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];\r\n    }\r\n \r\n\tNSDictionary *itemAtIndex = (NSDictionary *)[dataList objectAtIndex:indexPath.row];\r\n\tcell.textLabel.text = [itemAtIndex objectForKey:@\"nome\"];\r\n \r\n    return cell;\r\n}\r\n<\/pre>\n<p>I tre metodi sono i soliti che vanno inseriti quando si lavora con le UITableView. Concentriamoci un attimo sulle righe 22 e 23. Esse hanno il compito di ricavare un oggetto dalla lista &#8220;dataLista&#8221; (che contiene tutti i valori letti dal database), per estrarne poi il nome desiderato (ovviamente vengono estratti tutti i nomi, dal primo all&#8217;ultimo). Potete vedere che dall&#8217;oggetto &#8220;itemAtIndex&#8221; viene estratto solo il nome: potremmo creare anche altre combinazioni, ad esempio con il cognome. Per fare ci\u00f2 ci baster\u00e0 modificare la riga 23 ad esempio nel seguente modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[itemAtIndex objectForKey:@\"cognome\"];\r\n<\/pre>\n<p>Abbiamo concluso la nostra applicazione! Clicchiamo su \u201cBuild and Go!\u201d e controlliamo che funzioni tutto in maniera corretta.<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14.png\" alt=\"T044 - Screenshot 14\" title=\"T044_screenshot_14\" width=\"414\" height=\"770\" class=\"aligncenter size-full wp-image-3485\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14.png 414w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14-161x300.png 161w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/T044_screenshot_14-80x150.png 80w\" sizes=\"auto, (max-width: 414px) 100vw, 414px\" \/><\/a><br \/>\n<\/center><\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/SimpleRSSreader.zip\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/download_icon.png\" alt=\"\" width=\"33\" height=\"40\" align=\"middle\" \/><\/a> Se avete problemi con il tutorial, <a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/05\/sqlTutorial.zip\">questo \u00e8 il nostro file di progetto.<\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone SDK. Oggi vedremo come implementare un database&#8230;<\/p>\n","protected":false},"author":254,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[232,102,233,120],"class_list":["post-3469","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-database-iphone","tag-sqlite","tag-sqlite-manager","tag-tutorial"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3469","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/254"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=3469"}],"version-history":[{"count":4,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3469\/revisions"}],"predecessor-version":[{"id":3488,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/3469\/revisions\/3488"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=3469"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=3469"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=3469"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}