Eccoci con un nuovo tutorial dedicato alla programmazione per iPhone SDK. Oggi vedremo come implementare un database SQL con SQLite all’interno delle nostre applicazioni. Il database sarà molto semplice, creeremo infatti un’unica tabella che conterrà un elenco di nomi di persone. Questi record (ovvero i nomi salvati nel database) verranno mostrati successivamente in una TableView all’interno della nostra applicazione. Vedremo quindi anche come interrogare il nostro database con una semplicissima query.
Devo premettere, però, che non parlerò di SQL e database relazionali, i quali devono essere già conosciuti da chi affronta questo tutorial. È una scelta che potrebbe sicuramente non piacere a molti di voi, ciò nonostante capirete che una trattazione completa sull’argomento richiederebbe troppo tempo e non potrebbe essere certo proposta in un semplice tutorial pratico. Detto ciò, sappiate che potrete seguire il tutorial anche senza conoscere niente di SQL, ovviamente alcune caratteristiche e alcuni passaggi potrebbero risultare di difficile comprensione.
In questo tutorial sentirete spesso parlare di SQLite, ma cosa è di preciso?
SQLite è una libreria che implementa un DBMS (Database Management System) SQL, permettendo di creare un database all’interno di un unico file. Esso è 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’SQL, in quanto manca di alcune caratteristiche avanzate, presenti invece in DBMS più evoluti. SQLite è comunque molto veloce e leggero, perfetto quindi per le applicazioni per iPhone.
Creiamo un nuovo progetto e la struttura necessaria
Iniziamo creando un nuovo progetto di tipo “Navigation-based Application” e chiamiamolo “sqlTutorial”

Abbiamo quindi creato un progetto che ci fornisce già l’implementazione di una tabella, che useremo per visualizzare i dati letti dal nostro database.
Dobbiamo, però, inserire altre due cose molto importanti:
- una classe che si occuperà di comunicare con il database
- la libreria che permette tale comunicazione
Iniziamo a creare la classe che servirà ai nostri scopi. Andiamo in “File -> New File…” e creiamo una nuova “Objective-C class”, chiamiamola semplicemente “Data”:

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 “Frameworks” all’interno del nostro progetto, clicchiamo quindi su “Add -> Existing Frameworks…” e dall’elenco che apparirà selezioniamo “libsqlite3.0.dylib”:

Abbiamo così terminato la definizione della struttura principale del nostro progetto. Se avete eseguito tutto in maniera corretta dovreste avere un progetto simile a questo:

2) Definiamo la classe “Data”
Dobbiamo ora implementare la classe “Data”, su cui si basa gran parte di questo tutorial. Prima di iniziare a scrivere codice, focalizziamo l’attenzione su ciò che deve fare questa classe. Essa avrà il compito di:
- 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);
- interrogare la base di dati eseguendo una query impostata via codice;
- inserire i risultati della query all’interno di un’array, che verrà poi utilizzato per mostrare i dati all’interno della tabella;
Vediamo ora di implementare queste funzionalità, più altre caratteristiche che ci serviranno come supporto.
Iniziamo aprendo il file “Data.h”. Apriamolo e inseriamo al suo interno il seguente codice:
#import
#import
@interface Data : NSObject {
// Lista contenente i dati letti dal database
NSMutableArray *lista;
}
- (id)init:(NSString *)pathDB;
- (void)caricaValoriDaDB:(NSString *)dbPath;
- (unsigned)getSize;
- (id)objectAtIndex:(unsigned)theIndex;
@property (nonatomic, retain) NSMutableArray *lista;
@end
Alla riga numero 6 abbiamo dichiarato un array (di tipo NSMutableArray, quindi modificabile anche dopo la sua inizializzazione), che conterrà 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: è necessaria per dire alla nostra classe di utilizzare la libreria che abbiamo importato ad inizio della guida.
Apriamo ora il file “Data.m” e modifichiamo il suo codice come segue:
#import "Data.h"
static sqlite3 *database = nil;
@implementation Data
@synthesize lista;
// Inizializziamo l'oggetto della classe Data
- (id)init:(NSString *)pathDB{
// carichiamo i valori dal database
[self caricaValoriDaDB:pathDB];
return self;
}
// Ritorna la dimensione della lista (n° di elementi letti dal db)
- (unsigned)getSize {
return [lista count];
}
// Ritorna l'oggetto ad una data posizione
- (id)objectAtIndex:(unsigned)index {
return [lista objectAtIndex:index];
}
La prima istruzione degna di nota compare alla riga 3, ed è la definizione dell’oggetto che ci servirà per creare la connessione con il database.
Alla riga 10, invece, viene dichiarato il primo metodo, “init”, che deve essere invocato quando si vuole inizializzare un oggetto appartenente alla classe Data. Alla riga 12 chiamiamo il metodo “caricaValoriDaDB”, che ha il compito di interfacciarsi con il database ed eseguire le query sui dati (vedremo fra poco la sua implementazione). Il “return self” alla riga 13, infine, ritorna il puntatore dell’oggetto appena creato.
Alla riga 17 definiamo “getSize”, un semplice metodo che ci ritorna la dimensione della lista, e quindi il numero di elementi letti dalla nostra query. Questo ci servirà quando andremo a definire la tabella.
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° elemento della nostra lista, per poi elaborarlo oppure mostrarlo all’utente.
Dobbiamo ora implementare il metodo più complesso di questa classe, ovvero “caricaValoriDaDB”. Ecco il codice di tale metodo:
// Carica i valori dal database passato come parametro
-(void)caricaValoriDaDB:(NSString *)dbPath {
// lista temporanea
NSMutableArray *listaTemp = [[NSMutableArray alloc] init];
// Oggetto che contiene i vari elementi
NSMutableDictionary *dictionary;
NSMutableString *idPersona;//id della persona
NSMutableString *nome;//nome della persona
NSMutableString *cognome;//cognome della persona
if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
// query che ricava i valori
const char *sql = "select ID, Nome, Cognome from PERSONA";
sqlite3_stmt *selectstmt;
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
// ricaviamo i valori letti dalla query
idPersona = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];
nome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
cognome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)];
// inseriamo tutti i valori letti in un unico oggetto
dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:idPersona, @"id", nome, @"nome", cognome, @"cognome", nil];
[listaTemp addObject:dictionary];
[dictionary release];
}
}
self.lista = listaTemp;
[listaTemp release];
}
else
sqlite3_close(database);
}
Iniziamo ad analizzare questo metodo. Partiamo dall’intestazione, in cui viene definito un parametro “dbPath”: questo è il percorso del nostro database. Esso lo definiremo in seguito, nella classe che gestisce la tabella. In questo tutorial il database sarà in locale, ovverò sarà 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.
Subito dopo, creiamo alcuni oggetti, che ci servono per gestire i dati ricavati dalle query. Abbiamo, infatti, un oggetto “dictionary”, che conterrà i vari elementi ricavati dall’interrogazione al database. Le stringhe “idPersona”, “nome”, “cognome”, infatti, servono per salvare i valori letti, e inserirli all’interno dell’oggetto appena menzionato.
Alla riga 37 viene aperta la connessione con il database: essa si trova all’interno di un ciclo “if”: se tale controllo da esito positivo, si possono elaborare i dati, altrimenti si passa alla fine del metodo, in quanto non è possibile instaurare una connessione con il database. Se la connessione è 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’esecuzione ha avuto successo, possiamo ricavare i valori desiderati, altrimenti non verrà eseguita nessuna operazione.
Il ciclo while (riga 44) ci permetterà di scorrere tutti i risultati della nostra query (che potrebbero essere, ovviamente, più di uno), fino al termine. Potete notare che i risultati vengono inseriti in un oggetto di tipo “NSMutableDictionary”: esso è come un grande contenitore, che ci permette di inserire valori associandoci un tag (quello che facciamo alla riga 50).
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.
Gli ultimi due metodi da inserire nel file “Data.m” sono i seguenti:
+(void)finalizeStatements {
if(database)
sqlite3_close(database);
}
-(void)dealloc {
[lista release];
[super dealloc];
}
Il primo si occupa di concludere la query e di chiudere la connessione al database (va sempre messo), mentre il secondo è il classico “dealloc”.
Abbiamo concluso con la definizione della classe “Data”. Vediamo ora come creare il nostro database e inserirlo nel progetto.
3) Creiamo il database SQLite
Quello che dobbiamo andare a realizzare ora è un semplice database, con tecnologia SQLite. Possiamo lavorare da Terminale, per semplificarvi un po’ la vita, però, vi faremo vedere come crearlo utilizzando un plug-in per Firefox, chiamato “SQLite Manager“, che potete trovare a questo indirizzo. In alternativa esistono alcuni programmi dedicati, come SQLiteManager, che è, però, a pagamento.

Dopo aver installato l’estensione, andiamo in “Strumenti -> SQLite Manager”, si avvierà il tool che ci permetterà di creare il nostro database. Clicchiamo sull’icona del foglio bianco per crare un nuovo database:

e inseriamo “persone” come nome per il file:

Scegliamo ora dove salvare il file (vi consiglio sulla Scrivania, così potrete recuperarlo celermente in seguito).
Abbiamo così creato il nostro database, che risulta però essere completamente vuoto. Dobbiamo, quindi, creare al suo interno la tabella “Persone”. Per fare ciò, facciamo clic con il tasto destro su “Tables” che troviamo nella parte sinistra della schermata, e selezioniamo “Create Table”:

Si aprirà una nuova schermata, in cui dovremo definire gli attributi della tabella. Ecco cosa dobbiamo inserire:

Clicchiamo su “Ok” e su “Yes” nel messaggio successivo che apparirà.
Abbiamo inserito gli attributi necessari, ovvero nome, cognome e un identificativo univoco (id).
Non ci resta che inserire dei valori nella nostra tabella. Per fare ciò, andiamo nella sezione “Execute SQL” e inseriamo le seguenti istruzione:
INSERT INTO PERSONA (id,Nome,Cognome) VALUES ('1','Giovanni','Verdi');
INSERT INTO PERSONA (id,Nome,Cognome) VALUES ('2','Paolo','Rossi');
INSERT INTO PERSONA (id,Nome,Cognome) VALUES ('3','Luca','Bianchi');
INSERT INTO PERSONA (id,Nome,Cognome) VALUES ('4','Andrea','Busi');

Un messaggio in “Last Error” ci comunicherà se vi sono stati errori nell’inserimento dei dati, oppure se tutto è andato per il verso giusto.
Possiamo, infine, controllare i valori che abbiamo inserito, spostandoci nella sezione “Browse & Search”:

Abbiamo concluso! Chiudiamo il programmino e firefox, i cambiamenti sono già stati apportati al nostro database.
4) Concludiamo l’applicazione
Torniamo ora ad XCode, e concludiamo lo sviluppo della nostra applicazione. Per prima cosa, dobbiamo inserire fisicamente il database che abbiamo creato all’interno del nostro progetto. Trasciniamo quindi il file all’interno di XCode:

Nella schermata che apparirà inseriamo la spunta su “Copy items into destination group’s folder” e clicchiamo su “Add”

Siamo pronti per completare la nostra applicazione. Apriamo il file “RootViewController.h” e inseriamo il seguente codice:
#import "Data.h"
@interface RootViewController : UITableViewController {
// Oggetto con la lista degli elementi letti dal db
Data *dataList;
}
@end
Alla riga 5 abbiamo dichiarato la lista che conterrà gli elementi letti dal database. Per capirci, è quella che viene creata dal metodo “caricaValoriDaDB”, che abbiamo definito in precedenza.
Passiamo ora al file “RootViewController.m”. Iniziamo con il metodo “viewDidLoad”, che, come ormai dovreste sapere, ci consente di eseguire delle operazioni al caricamento dell’applicazione. Ecco come dobbiamo modificare tale metodo:
- (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];
}
Alla riga 4 impostiamo il titolo della nostra tabella, mentre alla riga 6 definiamo il percorso del nostro database. A prima vista può sembrare complessa, ma essa non fa altro che rilevare il percorso in cui si trova l’applicazione (sia essa su iPhone Simulator che su iPhone fisico) e aggiungere a tale percorso “persone.sqlite”, che è proprio il database che abbiamo inserito nel nostro progetto.
Alla riga 9, infine, inizializziamo la lista, passando alla funzione “init” proprio il percorso che abbiamo definito poche righe sopra.
Dobbiamo, ora, definire i metodi necessari per settare la tabella. Abbiamo già visto questi metodi nei tutorial dedicati alle tableView, quindi non mi soffermerò troppo sulla spiegazione. Sempre all’interno del file “RootViewController.m”, andiamo verso il fondo, e cerchiamo i metodi del protocollo UITableView, che dovremo completare nel seguente modo:
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [dataList getSize];
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
NSDictionary *itemAtIndex = (NSDictionary *)[dataList objectAtIndex:indexPath.row];
cell.textLabel.text = [itemAtIndex objectForKey:@"nome"];
return cell;
}
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 “dataLista” (che contiene tutti i valori letti dal database), per estrarne poi il nome desiderato (ovviamente vengono estratti tutti i nomi, dal primo all’ultimo). Potete vedere che dall’oggetto “itemAtIndex” viene estratto solo il nome: potremmo creare anche altre combinazioni, ad esempio con il cognome. Per fare ciò ci basterà modificare la riga 23 ad esempio nel seguente modo:
[itemAtIndex objectForKey:@"cognome"];
Abbiamo concluso la nostra applicazione! Clicchiamo su “Build and Go!” e controlliamo che funzioni tutto in maniera corretta.













79 Responses to “T#044 – Come implementare un database SQLite nelle nostre applicazioni”
24 Maggio 2010
Alessandro Messineobravi bravi bravi 🙂
25 Maggio 2010
Lelemolto interessante l’articolo, si puo’ prendere spunto per molte modifiche, volevo chiedervi un wrapper per sqlite in objective-c per rendere le chiamate piu’ semplici, grazie
29 Maggio 2010
federicoMa se volessi far comparire solo un campo del database come nell’esempio, ed in più quando selezioniamo la cella aprire un altra pagina con all’interno tutti i campi riguardanti la riga selezionata del database?! spero di essere stato chiaro ehe grazie
30 Maggio 2010
Andrea BusiFai la stessa procedura, ovvero modifichi la query leggendo dal database le informazioni che ti interessano..
Ad esempio, se vuoi legere tutte le informazioni di Paolo farai una query così:
1 Giugno 2010
jekrociao
ho provato di collegarmi in una base di dati distante ma ci riesco a scrivere l’URL
6 Giugno 2010
PlaceboCiao Ragazzi, utilissima questa guida, io vorrei applicarla ad un label, cioè che quando faccio il db, mi estragga i dati in un label
Come si fà?
Sto provando questsa procedura ma non va 🙁
– (IBAction)displayProv:(id)sender
{
NSIndexPath *indexPath;
NSString *cell = @”ciao”;
NSDictionary *itemAtIndex = (NSDictionary *)[dataList objectAtIndex:indexPath.row];
cell = [itemAtIndex objectForKey:@”nome”];
//NSString *ps = @””;
//ps = [ps stringByAppendingString:[dataList objectAtIndex:0]];
[textView setText:cell];
}
9 Giugno 2010
DavideCiao,
è un pò che seguo Devapp anche se un pò distante perchè con poco tempo a disposizione.
Ho pubblicato lo scorso anno la mia prima applicazione, una semplice app (HowMutch) che calcola il costo di un finanziamento/mutuo, in base ai classici parametri (durata, tasso etc etc).
Ora ne ho una a metà, che legge un DB Sqlite e presenta una serie di dati in base alle selezioni fatte.
Fin qui tutto ok.
Mi sono fermato davanti a due ostacoli abbastanza grossi da superare, dovuti fondamentalmente alla mia poco esperienza con l’objective-C-
e sono questi:
1) la mia tabella principale, quella che appare subito quando si avvia l’applicazione, ha un elenco di quasi 800 voci.
Non volevo caricarle tutte ma solo 20/25 e, come succede ad esempio con l’app store, nella venticinquesima cella, inserire la voce “Altre 25” e così via…
2) Vorrei implementare la ricerca nelle stesse voci, ma ho trovato solo esempi riguardanti degli array formattati e riempiti in precedenza, come l’esemio di questo tutorial.
Rinnovo i complimenti per il sito, mancava davvero un sito così, in italiano.
Davide
11 Giugno 2010
noyaAllora, non penso c’entri più di tanto l’implementazione in objC. Basta usare le funzioni di SQL per cui si usa la funzione LIMIT rigainizio, rigafine
es.
SELECT * FROM nome_tabella LIMIT numero_inizio, numero_fine
puoi conoscere invece il numero totale di tuple con la funzione COUNT(*)
SELECT COUNT(*) FROM nome_tabella
Sinceramente non so se sqllite permetta queste funzioni ma penso di si.
una volta che sai quante tuple e quanti risultati vuoi per pagina sai che avrai n pagine con n= totale_risultati / risultati_per_pagina
dopodichè ogni volta che vuoi avere gli altri risultati fai una chiamata al database mettendo come valori di limit (nel caso per esempio di 3 pagine da 25 risultati)
—pseudocodice—
n=0; n<3; n++
SELECT quello_che_cerchi FROM tabella LIMIT n*3, n*3+25
—
anche per quanto riguarda la ricerca, puoi usare gli strumenti messi a disposizione dal linguaggio SQL, se cerchi un nome esatto nella clausola WHERE metterai es WHERE nome = 'pippo' altrimenti c'è il comando LIKE che ti cerca risultati simili o contenenti sottostringhe…
11 Giugno 2010
noyaahem… non è proprio così la formula, ma credo piuttosto che sia
SELECT quello_che_cerchi FROM tabella LIMIT 25*n, (25*(n+1))-1
🙂
18 Giugno 2010
DaveDevilGrazie Noya,
mettiamola così, le nozioni teoriche di programmazione e di SQL le ho perchè programmo in altri linguaggi da più di 20 anni. Il mio “muro” è dovuto proprio al codice Objective-C e a dove inserire di preciso il codice e gli eventi.
Ad ogni modo, ti ringrazio molto per la dritta, voglio riprendere in mano questa App ferma da un pò e completarla…
Grazie ancora
Buona giornata
23 Giugno 2010
noyaLeggendo un pò le specifiche di SQLite pare che non si possa usare un database remoto, ma deve risiedere su filesystem del dispositivo.
Inoltre, ho fatto un pò di esperimenti, scoprendo che operazioni come l’aggiunta e la rimozione di righe non funzionano se non si copia prima il database dall’application bundle al dispositivo, perchè un db nell’application bundle è read-only
Consiglio quindi di dare un’occhiata a questa serie di tutorial su SQLite che ho trovato molto esaustivi per coprire le essenziali operazioni sul database:
http://www.iphonesdkarticles.com/search/label/SQLite
28 Giugno 2010
RebeCiao!
Innanzitutto complimenti per il blog!
Di seguito una domanda veloce veloce…
Se volessi connettermi ad un DB in locale già creato e funzionante? E’ possibile?
Fondamentalmente non mi serve di salvare i risultati delle query sull’iPhone, ma solo di inviare delle parole chiave e ricevere i risultati di una query sul dispositivo per poi visualizzarle in una tabella.
Ho provato a cercare in rete ma si fa solamente riferimento a dei framework con zero documentazione e che non sono riuscita ad implementare…
Chiunque riesca a darmi una dritta ha la mia totale riconoscenza!!!
Grazie in anticipo!
28 Giugno 2010
Staff devAPPCosa intendi per DB in locale già creato e funzionante? Considera che SQLite è l’unico DB compatibile in locale su iPhone, iPod e iPad.
PS: grazie per i complimenti ^^
28 Giugno 2010
RebeHo un database che gira in locale e lo gestisco con MAMP; il database ha alcune tabelle già popolate a priori.
Non mi serve avere una replica di tale database sull’iPhone, anche perché, potenzialmente, l’iPhone dovrebbe potersi connettere a questo database anche nel caso in cui non fosse in locale, ma per ora va bene così.
Quello che vorrei fare è delle semplici query tramite parola chiave inserita (alcune select e dei join, niente di che) dall’iPhone su questo database.
Quindi fondamentalmente devo potermi connettere a questo database, mandare la query e ricavarmi il risultato sull’iPhone. Il risultato lo organizzerò secondo una tabella navigabile.
Si può fare?
30 Giugno 2010
RebeCiao di nuovo!
Ho risolto da sola il mio problema, lo scrivo qui, magari può servire a qualcuno!
La soluzione è stata fare una NSURLRequest da iPhone contenente un file php che implementa la query con la parola chiave passata in GET, seguita da una NSURLConnection della request.
Lo stesso file PHP crea dopo la query su DB un XML ad hoc con i risultati della medesima.
L’XML viene sequenzialmente alla NSURLRequest caricato sull’iPhone in una nuova View e parserizzato in modo da visualizzare sullo schermo i risultati.
Il tutorial sull’XML trovato qui sul sito è stato di grande aiuto per quest’ultima parte!
Grazie ancora, mi avete salvato un pezzo di tesi con le vostre dritte! 🙂
30 Giugno 2010
Andrea Busiperfetto, meglio così!!
se per caso hai voglia di scriverci due righe, o anche solo un piccolo esempio su come hai fatto poi potremmo farne un articolo e renderlo disponibile per tutti 😉
facci sapere!
30 Giugno 2010
RebeVolentierissimo!
Devo spiegare tutto il procedimento nella mia Tesi – in Ing.Informatica – che affronta il problema tra l’altro della comunicazione di dispositivi iPhone, iPad e iPod Touch con interfacce multitouch programmate in Flash, quindi lo farò con molto piacere, e anche in tempi brevi!
Come faccio per mandarvelo una volta scritto?
30 Giugno 2010
Andrea Busimanda pure tutto a info at devapp.it 😉
15 Agosto 2010
Gabryfantastico tutorial. ma ho una domanda: la struttura del database (entità e relazioni) io l’avrei già fatta con coreData. mi servirebbe fare solo l’inserimento. come posso fare?
grazie
23 Agosto 2010
Andrea Busiciao, se stai utilizzando CoreData non devi fare riferimento a questo tutorial..
CoreData ha delle sue funzioni specifiche (e molto semplici) che permettono di inserire nuovi valori all’interno del db, senza preoccuparti del codice SQL..
3 Settembre 2010
FrancyHo seguito tutto il tutorial ed effettuato la build correttamente, ma appena faccio la build and go, parte il simulatore di iphone 4, visualizza per qualche secondo la pagina della mia applicazione (vuota) e poi ritorna immediatamente al menu delle applicazioni dove c’è il link alla mia applicazione. Riprovando ad aprirla dà sempre lo stesso problema. Cosa devo fare? la query è semplicissima e funziona. Qualche suggerimento?
6 Settembre 2010
Andrea Busiciao, detto così non mi sembra che ci siano errori nel tutoria, ma il problema sta nel codice che hai scritto tu (ad esempio nella query o nella gestione di qualche oggetto).
Se vuoi inviami il progetto a bubidevs at gmail.com , così provo a darci un’occhiata 😉
25 Settembre 2010
kikkoCiao a tutti, ho una domanda, c’è un modo per creare un database con una struttura argomento-titolo-contenuto e successivamente creare una pagina che mi stampa in automatico tot pulsanti quanti sono i titoli di un certo argomento che a loro volta mi mandano ad una pagina con il contenuto?
27 Settembre 2010
kikkoma come faccio a immagazzinare l’id del contenuto della cella selezionata per usarlo poi nella query?
1 Ottobre 2010
Andrea Busipuoi immagazzinarlo nella cella stessa, usando, ad esempio, un campo nascosto 😉
io di soltio utilizzo celle personalizzate, quindi al loro interno puoi utilizzare una variabile qualsiasi, che ovviamente non verrà visualizzata nella cella grafica..
23 Ottobre 2010
AlessandroCiao,
io ho il tuo stesso problema (solo che devo trattare con files JSON). Non è che potresti postare il codice usato per connetterti (e in caso i files php hehehe)?
Grazie
1 Dicembre 2010
CesareCiao,
ho riletto il tutorial e mi sono chiesto non sarebbe bello poterlo implementare affinche’ possa inserire e cancellare degli items.
A me servirebbe, -Un’idea per nuovo tuttorial ?
A presto
Cesare
1 Dicembre 2010
Andrea Busisicuramente terremo presente questa tua richiesta 😉
8 Dicembre 2010
Pasquale AmbrosiniCiao ragazzi, sto implementando la gestione di un database sql, ho scritto delle funzioni che prendono un indice casuale e mi restituiscono l’oggetto corrispondente del databse, il database ha circa 500 voci.L’unico problema che ho riscontrato è che se eseguo questa operazione per 20 volte consecutivamente circa, la memoria RAM diminuisce di circa 2mb, ho controllato tutto nelle mie funzioni ed ho constatato che è proprio questo pezzo di codice, (caricaValoriDaDB) che fa diminuire la memoria a disposizone. Non riesco a capire il perchè, un suggerimento sarebbe utile. Ciao!
31 Dicembre 2010
MatteoSalve, seppur in ritardo di qualche mese oltre ai doverosi complimenti vorrei domandarvi se oltre alle funzioni native di lettura (Select ecc) possono essere anche eseguite le funzioni di scrittura/aggiornamento: insert into e update da iPhone verso il Database (sia che esso sia in locale sull’iphone che su un web server remoto)?
E’ possibile scrivere quindi una applicazione che consenta, attraverso un form, di inserire dati testuali e riferimenti a una fotografia all’interno del database?
Vorrei sviluppare una apps che consenta all’utente di scattare una fotografia e aggiungere qualche dettaglio didascalico e salvare la fotografia nel “rullino” , salvare quindi nel database il nome della fotografia e le note inserite manualmente dall’utente.
11 Gennaio 2011
SagitterSalve ma come faccio se voglio connettere a un db online?
7 Febbraio 2011
riccardoCome collegarsi ad un db remoto?
9 Febbraio 2011
SQLiteManager e SQLiteConverter: Gestisci e converti i tuoi database per iPhone e iPad | devAPP[…] dati come XML, JSON, CoreData e via dicendo). Abbiamo già parlato di SQLite e iPhone in un nostro precedente articolo e abbiamo visto come si possa creare facilmente un db di questo tipo direttamente da terminale o […]
11 Marzo 2011
AngeloAnche a me interessa sapere come collegarlo ad un server remoto SQLite oppure ad un server SQL tramite l’interfaccia php.
16 Marzo 2011
Inserire, modificare ed eliminare dati da un DB SQLite nelle nostre applicazioni iPhone e iPad | devAPP[…] a tutti, con questo articolo riprendiamo un argomento trattato tempo fa da Andrea Busi dedicato a SQLite e, nello specifico, cercheremo di ampliare le conoscenze […]
17 Marzo 2011
GianlucaSalve ragazzi avrei qualche domanda:
io devo implementare un db in modo tale da fare inserimenti/cancellazioni da iphone e nello stesso tempo deve aggiornare una table view con i vari elementi del db e dalla table view quando clicco sugli elementi mi si apre un’altra view (con una mappa) che usa le istanze degli elementi del db… non so se mi sono spiegato… mi conviene usare SQLite o CoreData?
28 Marzo 2011
Andrea Busiè indifferente, dipende da cosa preferisci. CoreData è forse più performante (in quanto è stato scritto e progettato appositamente per Mac OS), mentre SQLite è un pochino più pesante, ma sicuramente più conosciuto.
Quindi ti consiglio di decidere in base alle tue conoscenze 😉
12 Aprile 2011
danielaSELECT * FROM persone WHERE Nome = ‘Paolo’
Ciao, scusa Andrea ho una domanda…..
se al posto di ‘Paolo’ ho il contenuto della cella selezionata che contiene un nome (ma non so che nome è) come posso fare?.
Pensavo ad un campo nascosto ma non so come si fa…..mi puoi fare un esempio di codice?
Grazie 🙂
12 Aprile 2011
Andrea Businiente di difficile, ti basta definire una stringa in cui imposti la query. Per intenderci, ti basta fare così:
13 Aprile 2011
danielaok però il mio progetto è strutturato così:
LombardiaController (.m .h e xib) con provincie della da selezionare.
-(IBAction)vaiMilano
DettVeterinariController *controller = [[DettVeterinariController alloc] initWithNibName:@”DettVeterinariController” bundle:nil];
controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:controller animated:YES];
[controller release];
}
il DettVeterinariController è il tuo RootViewController (come anche il Data.h .m)
La SELECT * FROM….. della viene fatta nel Data.m, ma il “variabileNome” arriva da LombardiaController (per esempio potrebbe essere Milano, e la select deve tirarmi fuori tutti i veterinari che hanno Milano nel campo città).
NSString *query = [NSString stringWithFormat:@”SELECT * from PERSONA nome where (citta = ‘%@'”,variabileCitta];
MI dici come devo passare questa stringa dal LombardiaController al DettVeterinariController, al data.m ?
Grazie ! é una vita che ci sono sopra !!!
13 Aprile 2011
Andrea BusiTi basta definire una variabile, in entrambe le classi, che andrai a settare in maniera opportuna.
Ad esempio, in “DettVeterinariController.h” definirai:
@interface DettVeterinariController : UIViewController { NSString *nomeCitta; } @property (nonatomic, retain) NSString *nomeCitta; @ende il relativo @synthesize nel file .m della classe
Il tuo metodo “vaiMilano” diventerà poi:
In questo modo hai passato il nome della città che potrai usare nella classe DettVeterinariMilano. Ovviamente la stessa cosa la devi fare con la classe Data 😉
13 Aprile 2011
danielaAndrea ho fatto tutto quello che mi hai detto.
ho messo il debug , nel Lombardia controller viene impostata correttamente, poi appena entra nel dettVeterinariController, subito nel metodo viewdidLoad…..mi dice nomeCitta : out of scope !!!
perchè non la tiene !!???
14 Aprile 2011
danielaNiente ! Non c’è verso. é proprio nel passaggio variabile che sbaglio qualche cosa, perchè se nella SELECT spstituisco where (citta = ‘%@'”,variabileCitta];
con where (citta = ‘Milano’]; funziona perfettamente.
Allora ho definito la mia variabile sia nel DettVeterinariController.h, che nel Data.h
ho messo il @synthesize in entrambe le classi .m
ho aggiunto al metodo VaiMilano
controller.nomeCitta = @”Milano”;
e niente , appena entra nel DettVetreinariController.m nomeCitta è nil
Helppp !!! Grazie ! 🙂
15 Aprile 2011
daniela@Andrea !!!
dove sei sparito ?? sei la mia unica speranza 🙂
16 Aprile 2011
Andrea Busistrano, io faccio così e funziona sempre..
prova a mandarmi il progetto via mail (bubidevs at gmail.com) così vedo di darci un’occhiata 😉
16 Aprile 2011
danimartialiceok stasera te lo mando !!
grazie 🙂
15 Giugno 2011
simo88salve a tutti! il mio problema è il seguente: ho creato un DB con sqlite manager formato da una tabella con le seguenti voci: idevento, titolo, descrizione, luogo, data, ora.
Attraverso una query faccio visualizzare data e titolo. Il mio intento sarebbe quello di cliccare su ognuna di queste celle e far comparire tutte le voci relative all’evento selezionato in un’ altra finestra. come faccio? potete spiegarmelo nel dettaglio con query x favore?
Vi ringrazio
17 Giugno 2011
Andrea BusiPer chi ciede come collegarsi ad un db remoto, purtroppo non è possibile farlo direttamente con SQLite.
Avrete bisogno di un webserver, che farà da tramite tra la vostra applicazione e il database remoto.
25 Agosto 2011
FrancescoSalve a tutti, se vorrei fare in modo che quando premo su di un nome mi venga visualizzato un nuovo layout con tutte le caratteristiche, es ID, nome e cognome? Come posso fare? Ho letto i commenti, ma sono proprio all’inizio. Conosco le sintassi sql, ma non capisco cosa modificare all’interno del progetto… GRAZIE
22 Settembre 2011
AlexCiao a tutti, una domanda…
Se una volta che seleziono nella tabella la voce “Luca”, come faccio a sapere l’id corrispondente di Luca all’interno del database ?
Gracias… 😉