DevTutorial #20 – Come implementare un database SQL

Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone SDK. Oggi vedremo come implementare un database SQL all’interno delle nostre applicazioni. Creeremo una tabella in cui andremo ad inserire i valori letti dal nostro database, dopo aver eseguito una query predefinita.

Devo premettere, però, che non parlerò di SQL e database relazionali, che devono essere già conosciuti da chi affronta questo tutorial. È una scelta che potrebbe non piacere a molti di voi, però richiederebbe troppo tempo e una trattazione che non può essere fatta in un semplice tutorial. Detto ciò, è possibile seguire il tutorial anche senza conoscere niente di SQL, ovviamente alcune caratteristiche e alcuni passaggi potrebbero risultare di difficile comprensione.

Leggi il tutorial completo su devAPP

Andrea Busi | @bubidevs

Laureato in Ingegneria Informatica, ho fondato nel 2008 questo piccolo blog, in cui racconto le mie esperienze e i miei pensieri sul mondo dell'informatica. Nella vita mi occupo di sviluppo software, e nel tempo libero continuo a coltivare la mia passione per il mondo iOS.

.ommenti a “DevTutorial #20 – Come implementare un database SQL

  1. Dzamir ha detto:

    Io consiglio vivamente di utilizzare coredata al posto di sqlite.

  2. ducadicrespo ha detto:

    Non vedo l’ora di avere tempo per iniziare a studiare la programmazione su iPhone.
    Grazie Andrea!

  3. Andrea Busi ha detto:

    @Dzamir: hai ragione, però SQL rimane la tecnologia più usata, quindi un tutorial mi sembrava d’obbligo..
    Comunque spero di poter fare un tutorial anche su CoreData in futuro! 😉

    @Ducadicrespo: ihih, comincia il prima possibile, mai perdere la voglia!!

  4. Alessandro ha detto:

    Grande tutorial!

  5. Sylter ha detto:

    Ottimo tutorial!!! 😛 😛 😛

  6. Dzamir ha detto:

    Infatti se si hanno forte conoscenze di sqlite o un database già impostato conviene seguire questa strada. Ma per i nuovi arrivati che non sanno che tecnologia scegliere consiglio coredata che, se utilizzato opportunamente, è ordini di magnitudo superiore alle semplici query sql.

  7. nebula_1979 ha detto:

    Vorrei segnalare che esiste anche un altro software free che permette di creare/editare/analizzare i file SQLite.
    http://sqlitebrowser.sourceforge.net/

    PS: chiaramente, per i nostalgici della shell, si può fare anche dal terminal … ma non è molto user friendly …

  8. DaveDevil ha detto:

    Andrea innanzitutto complimenti per questo tutorial che era quello che stavo aspettando per la mia nuova applicazione.
    Ho iniziato solo da qualche mese a sviluppare per iphone, fino ad ora ho sempre usato RPG, Visual Basic e l’approccio all’objective-C diciamo che non è stato proprio indolore.
    Ma piano piano sto iniziando a venir fuori dal fango grazie anche a tutorial come questo.
    Questo sito è tra i miei preferiti e lo consulto ogni giorno, appena mi siedo davanti al mio mac.
    Continua così
    D.

  9. Andrea Busi ha detto:

    @DaveDevil: grazie mille! queste sono le cose che mi rendono fiero del mio piccolo sito, sapere che per qualcuno sono un punto di riferimento..
    grazie ancora e continua a seguirci! 😉

  10. Paolo ha detto:

    I tuoi tutorial sono sempre molto belli. Grazie. Ciao

  11. Rynox ha detto:

    Credo ci sia un errore nell’ultima riga di codice che proponi, ovvero nel caso in cui volessimo estrapolare anche il cognome (linea 23):

    [itemAtIndex objectForKey:@”nome”]

    Stessa errore anche nella tua guida in vendita, unica differenza è che li hai aggiunto il “;” a fine istruzione 😉

  12. Andrea Busi ha detto:

    @Rynox: grazie mille, ho appena corretto questa guida, poi correggo anche il libro 😉

  13. rideMax ha detto:

    @Andrea Busi:
    ciao, provando a lanciare anche una insert mi accorgo che, una volta rialnciata l’applicazione il database mi si presenta vuoto, anche se lo statement (insert) è stato correttamente eseguito.
    Come mai il database non è persistente?

    Ottimo tutorial, comunque!

  14. Andrea Busi ha detto:

    @rideMax: azz, questa non è una bella cosa..

    strano.. appena riesco provo un po’ anche io, poi ti faccio sapere!

  15. rideMax ha detto:

    @Andrea Busi:
    ho seguito il tuo tutorial che è ottimo, aggiunto una procedura di insert. Dopo la procedura e anche dopo la chiusura dell’applicazione il database è corretto e contiene gli elementi giusti (il database viene copiato nella cartella myApp.app giusto?),

    Appena rilancio l’applicazione il database ridiventa vuoto. Credo sia un problema dovuto alla gestione del file system locale dell’iphone (come funziona esattamente?) e non sono riuscito a risolvere.
    Ciao e grazie.

  16. Andrea Busi ha detto:

    @rideMax: ma certo, elementare Watson!!

    quando ricompili l’applicazione, viene creato nuovo anche il database, quindi le modifiche che hai apportato vanno perse..

    prova a modificare il database, uscire dal tuo programma ma rimanere in iPhone Simulator, vedrai che quando la riapri le modifiche ci saranno 😉

  17. rideMax ha detto:

    @Andrea Busi:
    ok grazie, ma non ho ben capito cosa intendi.
    In che senso rimanere nell’iphone Simulator? Senza ricompilare?
    Grazie cmq!

  18. Andrea Busi ha detto:

    @rideMax: si esatto.. ogni volta che ricompili l’applicazione viene inserito il database originale, quello che hai inserito nel progetto..

    Se tu non chiudi l’iPhone Simulatore, e riapri l’applicazione (senza ricompilarla quindi) vedrai che funzionerà 😉

  19. rideMax ha detto:

    ok, ora non posso riprovare. Lunedi ti faccio sapere. Ciao e grazie!

  20. andrea ha detto:

    ciao, volevo chiederti una cosa, posso utilizzare questo metodo anche per connettermi ad un db on-line?? mi dovrei connettere al mio sito per fare delle query sul database e poi cambiare dei valori

  21. Andrea Busi ha detto:

    @andrea: non ho mai provato, ma penso proprio di si.. dovrebbe funzionare correttamente..

  22. andrea ha detto:

    ok, provo e poi ti dico…. cmq, ora ho risolto, ma penso sarebbe utile aver fatto un metodo per inserire elementi… grazie mille comunque…

  23. Andrea Busi ha detto:

    @andrea: si, è uno dei tutorial nella “To-Do list”, speriamo di poterlo fare quanto prima 😉

  24. andrea ha detto:

    ok, se ti serve io ho risolto con una semplice funzione…

  25. Andrea Busi ha detto:

    @andrea: certamente, se vuoi mandamela pure a bubidevs@gmail.com

  26. Ross ha detto:

    @andrea:

    sarei interessato anch’io a sapere come hai collegato un db online

    raffyx@gmail.com

    grazie mille

  27. andrea ha detto:

    Ciao Andrea…. son ancora alle prese con la connessione al database on-line, ho fatto diverse prove ma non ci riesco…. mi diresti se c’è un modo spicciolo per farlo??
    grazie..

  28. Andrea Busi ha detto:

    @andrea: ciao, ho provato a cercare su Internet, perchè serviva anche a me ma non ho trovato niente ;-(

    proverò a cercare ancora, se trovo qualcosa ti farò sapere e sicuramente aggiornerò la guida..

  29. andrea ha detto:

    cercando in rete non ho trovato niente… ho letto però che consigliano di usare il php se si deve lavorare su db on-line…. e poi creare il proprio db in locale ( bisogna vedere la mole di dati) solo che il problema è k di php non ne so niente…
    mi sa che dovrò imparare il php….:)
    secondo me ti conviene utilizzare il php, alla fine mi sembra anche piu facile da utilizzare…

  30. Andrea Busi ha detto:

    @andrea: esatto, ho trovato anche io così.. a dire la verità ci sono rimasto un po’ male, non vedo perchè debba passare attraverso una pagina in php per accedere al mio db..

    va beh, proveremo anche questa soluzione dai 😉

  31. andrea ha detto:

    e cosi ora mi tocca impararmi anche il php…. casomai potresti fare un tutorial sulle 4 cose di php k servono ;);)

  32. Andrea Busi ha detto:

    @andrea: purtroppo di php so davvero troppo poco, so solo modificare un po’ le pagine già fatte, ma non so scriverle da zero xD

  33. andrea ha detto:

    piano piano sto imparando qualcosa anche di PHP:):) e sto adattando il tuo esempio alle mi esigenza, ma nel mio database ho anche dei valori vuoti, e quando cerco di inserirli crasha perhè lo spazio della stringa non è allocato, senza dover ogni volta fare un controllo se il valore è vuoto, posso allocare prima lo spazio per le stringhe e poi impostargli il valore dopo?? Ho provato un po di soluzioni ma non son riuscito a far niente….

  34. Andrea Busi ha detto:

    @andrea: si, penso che si possa tranquillamente fare..
    ad esempio usi una NSMutableString, quindi farai

    NSMutableString *stringa = [[NSMutableString alloc] init];

    poi dove vuoi imposti il valore a tale stringa. Non sono sicuro che funzioni, ma dovrebbe andare.. Prova e fammi sapere!

  35. davide ha detto:

    Ciao, mi potresti dare una mano?
    in pratica non mi interessa visualizzare i dati letti in una tabella, ma semplicemente metterli in delle variabili.
    mi spiego meglio, quello che vorrei è una cosa del tipo:
    ho già la mia view-based application, in una vista ho delle label, leggo la riga del db e metto le varie istanze nelle label. è fattibile?
    davide

  36. Andrea Busi ha detto:

    @davide: ciao, il procedimento è uguale.. hai già i tuoi dati salvati nella lista “dataList”.. invece di implementare la tabella utilizzerai quei valori per inserirli nelle tue label, ad esempio facendo:

    NSDictionary *itemAtIndex = (NSDictionary *)[dataList objectAtIndex:indexPath.row];
    nomeLabel.text = [itemAtIndex objectForKey:@”nome”];

  37. davide ha detto:

    @Andrea Busi: grazie, nel weekend provo! 🙂

  38. davide ha detto:

    @Andrea Busi: sempre io 🙂
    sono riuscito a scrivere nella label, grazie mille!! 🙂
    approffitto ancora della tua pazienza se posso…
    nel db ho un campo di tipo int e quindi ho dichiarato una variabile prova di tipo int, per leggere faccio così
    prova = sqlite3_column_int(selectstmt, 6); e fin qui tutto ok…
    ma quando lancio l’applicazione si chiude, credo che il problema sia dovuto all’inserimento nel “dictionary” poichè prova,”@prova” non credo vada bene per un tipo int. come posso risolvere? grazie!

  39. Costantino ha detto:

    @Andrea Busi:

    Ciao,
    nella risposta che hai dato a Davide hai detto il procedimento è lo stesso nel caso in cui si voglia scrivere in una label. Ma non capisco una cosa: la struttura rimane una TableView? Io voglio far scrivere il contenuto di un campo in una label che si trova in una semplice view. Come posso procedere? Nello specifico mi po ne dei dubbi l’istruzione:

    NSDictionary *itemAtIndex = (NSDictionary *)[dataList objectAtIndex:indexPath.row];

    Nel caso di una semplice view con una label, come posso modificarla?

    Ciao e grazie
    Costantino

  40. Andrea Busi ha detto:

    @Costantino: no, ovviamente non avrai più bisogno di una tabella. Ti resterà il metodo “viewDidLoad” in cui creerai la lista, poi sempre all’interno di quel metodo puoi, ad esempio, settare tutte le label che ti interessano 😉

    Ad esempio se hai una label puoi fare così:

    – (void)viewDidLoad {
    [super viewDidLoad];

    self.title = @”Lista Autori”;
    //leggiamo il path del database
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@”persone.sqlite”];

    //creiamo la lista degli autori
    dataList = [[Data alloc] init:defaultDBPath];

    // setto la label
    NSDictionary *itemAtIndex = (NSDictionary *)[dataList objectAtIndex:indexPath.row];
    label.text = [itemAtIndex objectForKey:@”nome”];
    }

  41. Dario ha detto:

    Ciao, ottimi i tuoi tutorial e anche tuo libro..
    ho appena cominciato ma mi sono scontrato subito su un problema.
    Ho creato una TabBarApplication prendendo spunto dalla tua TabTutorial, con la differenza che una vista contiene una vista UITableView
    con il sul UITableViewController

    Nella classe TabellaController.m dove carica la viewDidLoad() ho inserito il codice del tuo tuorial ma quando faccio come te

    dataList = [[Data alloc] init:defaultDBPath];

    ricevo questo errore:

    Documents/Progetti/TabBarTutorial/Classes/../TabellaController.m:53: error: void value not ignored as it ought to be

    puoi aiutarmi?

    grazie

  42. Andrea Busi ha detto:

    @Dario: controlla di aver implementato correttamente i metodo “init” della classe Data, sembra che hai sbagliato il tipo di ritorno..

  43. Luca ha detto:

    ciao,
    ottimo lavoro.
    Volevo fare una domanda riguardo una possibile leak: nel metodo caricaValoriDaDB: “listaTemp” viene allocato prima dell’istruzione if e rilasciata all’interno del blocco; in caso non dovesse essere eseguito quest’ultimo, “listTemp” avrebbe un retain count pari a 1.
    E’ possibile rilasciare l’oggetto dopo la chiusura del blocco?

  44. Andrea Busi ha detto:

    @Luca: osservazione più che corretta, il rilascio dovrebbe avvenire alla fine dell’if 😉

  45. Serena ha detto:

    Ciao!
    il tuo tutorial mi è stato utilissimo!
    volevo chiederti però se avevi qualche esempio di inserimento nel db… ho una tab bar dove da una parte ho un elenco, in un’altra vista invece mi collego a un server da cui scarico un oggetto da me creato (fino alla creazione del’oggetto, composto per lo più da stringhe ci sono), dopodiché ho un pulsante download da cui dovrebbe partire una query di inserimento al db, e di conseguenza vorrei anche aggiornare la table view iniziale coi nuovi valori inseriti… hai qualche dritta su come posso fare? sinceramente ora come ora non so nemmeno se il metodo insert è giusto, ma gli ho detto di darmi un nslog se trova un errore e nn ne ha, oppure, a volte, mi restituisce “not an error”, quindi credo stia funzionando in maniera corretta… solo che, ovviamente, nel mio db iniziale non visualizzo nulla, e non so se nella copia del simulatore c’è su qualcosa…
    se puoi aiutarmi 😀
    grazie!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*