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.
46 comments On DevTutorial #20 – Come implementare un database SQL
Io consiglio vivamente di utilizzare coredata al posto di sqlite.
Non vedo l’ora di avere tempo per iniziare a studiare la programmazione su iPhone.
Grazie Andrea!
@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!!
Grande tutorial!
Ottimo tutorial!!! 😛 😛 😛
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.
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 …
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.
@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! 😉
I tuoi tutorial sono sempre molto belli. Grazie. Ciao
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 😉
@Rynox: grazie mille, ho appena corretto questa guida, poi correggo anche il libro 😉
@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!
@rideMax: azz, questa non è una bella cosa..
strano.. appena riesco provo un po’ anche io, poi ti faccio sapere!
@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.
@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 😉
@Andrea Busi:
ok grazie, ma non ho ben capito cosa intendi.
In che senso rimanere nell’iphone Simulator? Senza ricompilare?
Grazie cmq!
@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à 😉
ok, ora non posso riprovare. Lunedi ti faccio sapere. Ciao e grazie!
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
@andrea: non ho mai provato, ma penso proprio di si.. dovrebbe funzionare correttamente..
ok, provo e poi ti dico…. cmq, ora ho risolto, ma penso sarebbe utile aver fatto un metodo per inserire elementi… grazie mille comunque…
@andrea: si, è uno dei tutorial nella “To-Do list”, speriamo di poterlo fare quanto prima 😉
ok, se ti serve io ho risolto con una semplice funzione…
@andrea: certamente, se vuoi mandamela pure a bubidevs@gmail.com
@andrea:
sarei interessato anch’io a sapere come hai collegato un db online
raffyx@gmail.com
grazie mille
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..
@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..
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…
@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 😉
e cosi ora mi tocca impararmi anche il php…. casomai potresti fare un tutorial sulle 4 cose di php k servono ;);)
@andrea: purtroppo di php so davvero troppo poco, so solo modificare un po’ le pagine già fatte, ma non so scriverle da zero xD
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….
@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!
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
@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”];
@Andrea Busi: grazie, nel weekend provo! 🙂
@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!
@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
@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”];
}
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
@Dario: controlla di aver implementato correttamente i metodo “init” della classe Data, sembra che hai sbagliato il tipo di ritorno..
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?
@Luca: osservazione più che corretta, il rilascio dovrebbe avvenire alla fine dell’if 😉
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!