{"id":6215,"date":"2011-03-16T11:28:08","date_gmt":"2011-03-16T10:28:08","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6215"},"modified":"2011-03-16T11:28:29","modified_gmt":"2011-03-16T10:28:29","slug":"t089-inserire-modificare-ed-eliminare-dati-da-sqlite-nelle-nostre-applicazioni-iphone-e-ipad","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/t089-inserire-modificare-ed-eliminare-dati-da-sqlite-nelle-nostre-applicazioni-iphone-e-ipad\/","title":{"rendered":"T#089 &#8211; Inserire, modificare ed eliminare dati da un DB SQLite nelle nostre applicazioni iPhone e iPad"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/12\/sqlite370_banner.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/12\/sqlite370_banner.gif\" alt=\"Logo SQLite\" title=\"sqlite370_banner\" width=\"220\" height=\"101\" class=\"alignleft size-full wp-image-5504\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/12\/sqlite370_banner.gif 220w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/12\/sqlite370_banner-150x68.gif 150w\" sizes=\"auto, (max-width: 220px) 100vw, 220px\" \/><\/a> Ciao a tutti, con questo articolo riprendiamo un <a href=\"http:\/\/www.devapp.it\/wordpress\/t044-come-implementare-un-database-sqlite-nelle-nostre-applicazioni.html\" target=\"_blank\">argomento trattato<\/a> tempo fa da Andrea Busi dedicato a SQLite e, nello specifico, cercheremo di ampliare le conoscenze sull&#8217;integrazione dei database nelle nostre applicazioni iPhone e iPad spiegando come inserire, modificare o eliminare dati dal DB, un argomento utile che ogni sviluppatore iOS prima o poi dovr\u00e0 affrontare.<!--more--><\/p>\n<h4>Creare il database SQLite<\/h4>\n<p>Come ormai saprete sicuramente, SQLite \u00e8 l&#8217;unica risorsa che possiamo utilizzare se vogliamo implementare un database interno alle nostre applicazioni, certo ci sono altri metodi per la gestione dei dati (CoreData, Parsing, &#8230;) ma quello che interessa a noi oggi \u00e8 proprio SQLite. Se ancora non sapete come si costruisce un Database SQLite, potete leggere il precedente tutorial di Andrea (linkato sopra) che spiega come creare il db tramite un ottimo plugin gratuito per firefox: SQLite Manager, che potete scaricare seguendo <a href=\"https:\/\/addons.mozilla.org\/en-US\/firefox\/addon\/sqlite-manager\/\" target=\"_blank\">questo indirizzo<\/a>, in alternativa, potrete creare il vostro db tramite terminale (presente in ogni Mac) o ancora tramite qualche software a pagamento di terzi, come <a href=\"http:\/\/www.devapp.it\/wordpress\/sqlitemanager-e-sqliteconverter-gestisci-e-converti-i-tuoi-database-per-iphone-e-ipad.html\" target=\"_blank\">SQLiteManager o SQLiteConverter<\/a>, recensiti sulle nostre pagine.<\/p>\n<h4>Cosa vedremo in questo tutorial?<\/h4>\n<p>Quello di oggi, in realt\u00e0, non sar\u00e0 un vero e proprio tutorial passo passo, cercher\u00f2 invece di fare una carellata delle cose principali da sapere per lavorare con questo tipo di database, e in particolare mi soffermer\u00f2 sulle tre funzioni principali, praticamente indispensabili:<\/p>\n<ul>\n<li>Caricare valori dal DB<\/li>\n<li>Inserire valori nel DB<\/li>\n<li>Eseguire query (delete, update..) per eliminare e aggiornare i record del DB<\/li>\n<\/ul>\n<p>Bene, partiamo!<\/p>\n<p>La prima cosa da fare, ovviamente, \u00e8 creare un database. Fatto questo, prima di iniziare con la programmazione occorre considerare una cosa fondamentale: se dovete lavorare su un File, quindi inserire od eliminare dati dovete NECESSARIAMENTE copiarlo nella cartella &#8220;Documents&#8221; della vostra app. Questo perch\u00e9 i file che trascinate dentro il vostro progetto faranno parte dell pacchetto iniziale dell&#8217;applicazione e, tutti i file all&#8217;interno di questo pacchetto, sono disponibili in realt\u00e0 in SOLA LETTURA. Senza questo piccolo accorgimento, non sarete in grado di lavorare con i dati sul database.<\/p>\n<h4>Copiare il database SQLite nella cartella documents<\/h4>\n<p>Creato il database, prendete il file generato e trascinatelo nel vostro progetto in Xcode (nel men\u00f9 ad albero sulla sinistra) facendo attenzione a copiarlo. Come detto poco fa, per\u00f2, questo non basta e dovremo creare una copia del file nella cartella Document della nostra applicazione. Per far questo, nel metodo <em>viewDidLoad<\/em> (o in qualsiasi altro metodo che venga richiamato prima dell&#8217;utilizzo del DB) aggiungiamo il codice necessario per effettuare la copia:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n\/\/percorso file su cartella documents\r\nNSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);\r\nNSString *documentsDir = [documentPaths objectAtIndex:0];\r\nNSString *path = [documentsDir stringByAppendingPathComponent:@\"nomeDB.sqlite\"];\r\n\t\r\n\/\/controllo se il file esiste\r\nif(![[NSFileManager defaultManager] fileExistsAtPath:path])\r\n{\r\n\t\/\/se non esiste lo copio nella cartella dosuments\r\n\t\tNSString *pathLocale=[[NSBundle mainBundle] pathForResource:@\"nomeDB\" ofType:@\"sqlite\"];\r\n\t\tif ([[NSFileManager defaultManager] copyItemAtPath:pathLocale toPath:path error:nil] == YES) \r\n\t\t{\r\n\t\t\tNSLog(@\"copia eseguita\");\r\n\t\t}\t\t\r\n}\r\n<\/pre>\n<p>Vediamo cosa abbiamo appena scritto. Le prime 3 righe di codice servono per ottentere il <em>path<\/em> in cui andremo a mettere il DB, nel nostro caso la cartella documents.<br \/>\nCon <em>pathLocale<\/em> andiamo invece ad ottenere il percorso del nostro file dentro il progetto, cio\u00e8 quello in sola lettura per intenderci, quindi copiamo il file da <em>pathLocale<\/em> a <em>path<\/em>.<br \/>\nFatto questo siamo certi che il nostro Database sar\u00e0 a questo punto disponibile anche in scrittura.<\/p>\n<h4>Prepariamo il progetto e importiamo la libreria SQlite<\/h4>\n<p>Andiamo ora a studiare le tre funzioni per interagire con il nostro bellissimo database posizionato al posto giusto. Per prima cosa, nella nostra classe, quella in cui andremo ad implementare le funzioni, dobbiamo importare la classe <strong>libsqlite3.dylib<\/strong>, ricordiamoci di aggiungere nel relativo file di intestazione (.h) l&#8217;import:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import <sqlite3.h>\r\n<\/pre>\n<p>Nel file di implementazione (.m), quindi,  sotto l&#8217;istruzione:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#import<miaclasse.h> \r\n<\/pre>\n<p>aggiungiamo il seguente codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nstatic sqlite3 *database = nil;\r\nstatic sqlite3_stmt *selectstmt = nil;\r\nstatic sqlite3_stmt *addStmt = nil;\r\nstatic sqlite3_stmt *delStmt = nil;\r\n<\/pre>\n<p>La prima riga \u00e8 il puntatore al DB, mentre le alte due sono gli statement per operare sul database. Il primo per selezionare gli elementi, il secondo per l&#8217;inseriemento degli elementi, mentre l&#8217;ultimo \u00e8 infine per l&#8217;eliminazione.<\/p>\n<h4>Leggere i valori (record) dal database SQLite<\/h4>\n<p>Partiamo ora con il primo metodo, quella per ottenere (ovvero leggere) i valori dal nostra database SQLite:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(NSArray *)caricaValoriDaDBStandard:(NSString *)query :(NSArray *)arrayKey \r\n{\r\n\t\r\n\tNSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);\r\n\tNSString *documentsDir = [documentPaths objectAtIndex:0];\r\n\tNSString *dbPath = [documentsDir stringByAppendingPathComponent:@\"nomeDB.sqlite\"];\r\n\t\r\n\tif (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {\r\n\t\t\/\/ query che ricava i valori\r\n\t\tconst char *sql = [query UTF8String];\r\n\t\tsqlite3_stmt *selectstmt;\r\n\t\t\r\n\t\t\/\/ lista temporanea\r\n\t\tNSMutableArray *listaTemp = [[[NSMutableArray alloc] init] autorelease];\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\tif(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) \r\n\t\t{\r\n\t\t\t\r\n\t\t\twhile(sqlite3_step(selectstmt) == SQLITE_ROW) \r\n\t\t\t{\r\n\t\t\t\t\r\n\t\t\t\t\/\/ Oggetto che contiene i vari elementi\r\n\t\t\t\tNSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];\r\n\t\t\t\t\/\/ ricaviamo i valori letti dalla query\r\n\t\t\t\tfor (int k=0; k<[arrayKey count]; k++) \r\n\t\t\t\t{\r\n\t\t\t\t\t\/\/NSMutableString *contenuto = [NSMutableString alloc];\r\n\t\t\t\t\tif (sqlite3_column_text(selectstmt, k) == NULL) \r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\/\/NSMutableString *contenuto = [[NSMutableString alloc] initWithFormat:@\"\"];\r\n\t\t\t\t\t\t\/\/NSLog(@\" %@ \\n\", contenuto);\r\n\t\t\t\t\t\t[dictionary setObject:@\"\" forKey:[arrayKey objectAtIndex:k]];\r\n\t\t\t\t\t\t\/\/[contenuto release];\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse \r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tNSMutableString *contenuto = [[NSMutableString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt, k)];\r\n\t\t\t\t\t\t\/\/NSLog(@\" %@ \\n\", contenuto);\r\n\t\t\t\t\t\t[dictionary setObject:contenuto forKey:[arrayKey objectAtIndex:k]];\r\n\t\t\t\t\t\t[contenuto release];\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t[listaTemp addObject:dictionary];\r\n\t\t\t\t\r\n\t\t\t\t[dictionary release];\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tNSLog(@\"%@\", listaTemp);\r\n\t\tsqlite3_close(database);\r\n\t\treturn listaTemp;\r\n\t}\r\n\telse\r\n\t{\r\n\t\tsqlite3_close(database);\r\n\t\tNSMutableArray *listaTemp = [[[NSMutableArray alloc] init] autorelease];\r\n\t\treturn listaTemp;\r\n\t}\r\n}\r\n<\/pre>\n<p>ricordate di dichiarare nel file .h il metodo, in questo modo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(NSArray *)caricaValoriDaDBStandard:(NSString *)query :(NSArray *)arrayKey;\r\n<\/pre>\n<p>Come funziona? In pratica a questa funzione viene passata la stringa contenente la query pi\u00f9 un array contenente le chiavi dei valori che andremo a recuperare. Per esempio, se dobbiamo ottenere <em>nomeutente<\/em>, <em>username<\/em> e <em>password<\/em> dal db, dovremo creare una stringa simile a questa:<\/p>\n<pre lang=\"sql\" line=\"1\" escaped=\"true\">\r\n\"SELECT nomeutente, username, password FROM miaTabella\" \r\n<\/pre>\n<p>e un array che conterr\u00e0 le 3 stringhe \"nomeutente\", \"username\" e \"password\". Otterremmo quindi un array in cui all'interno sar\u00e0 presente un dizionario per ogni riga (record) del database e ogni valore sar\u00e0 contrassegnato con la chiave inserita nell'array (ricordatevi di inserire le chiavi nello stesso ordine in cui le mettete nella query).<\/p>\n<p>Passiamo ad analizzare il codice. Nelle prime 3 righe otteniamo il percorso del nostro DB. Successivamente apriamo la connessione con esso e, se tutto \u00e8 andato correttamente a buon fine, possiamo procedere.<br \/>\nTrasformiamo la nostra query in UTF8 (formato compatibile per i DB) e creiamo lo statement per l'esecuzione della query.<br \/>\nIl secondo <em>if<\/em> lancia la query e se il risualtato ottenuto \u00e8 <em>SQLITE_OK<\/em> significa che tutto \u00e8 andato bene.<br \/>\nA questo punto non ci resta che \"ciclare\" su ogni riga di risultato, tramite <em>sqlite3_step<\/em>. Quello che facciamo dentro il <em>while<\/em> \u00e8 un po' pi\u00f9 semplice: dichiariamo un dizionario e a questo punto sappiamo quanti elementi abbiamo ottenuto della query (grazie all'array di chiavi) creiamo un <em>for<\/em> e andiamo a riempire il nostro valore, associando il valore preso dal DB con<\/p>\n<pre lang=\"sql\" line=\"1\" escaped=\"true\">\r\nsqlite3_column_text(selectstmt, k)\r\n<\/pre>\n<p>dove k parte da 0 e arriva al numero di valori che dobbiamo ottenere e come chiave la stringa presa dall'array di chiavi. Se il valore ottenuto dalla query fosse <em>null<\/em>, inseriamo come valore una stringa vuota. Aggiungiamo il dizionario all'array principale e ricominciamo il ciclo finch\u00e8 non abbiamo pi\u00f9 record a disposizione. Infine chiudiamo il database.<\/p>\n<p>Ecco quindi un esempio di come possiamo ricavare valori dal nostro database:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nNSString * query = @\u201d SELECT nomeutente, username, password FROM miaTabella\u201d;\r\nNSArray * arrayQuery = [[NSArray alloc] initWithObjects:@\u201dnomeutente\u201d,@\u201dusername\u201d,@\u201dpassword\u201d,nil];\r\nNSArray * arrayElementr = [self caricaValoriDaDBStandard:query :arrayQuery];\r\n<\/pre>\n<p>cos\u00ec facendo otterremo un array composto da un dizionario per ogni riga del DB, quindi accediamo ai valori con le chiavi inserite nell'array di partenza.<\/p>\n<h4>Inserire dati nel database SQLite<\/h4>\n<p>Vediamo ora come fare per inserire degli elementi nell'array.<\/p>\n<p>Questa \u00e8 la dichiarazione nel .h:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n-(void)inserisciValoriDaDB:(NSArray *)insert :(NSString *)sqlAdd;\r\n<\/pre>\n<p>questo motedo funziona cos\u00ec:<\/p>\n<p><em>sqlAdd<\/em> sar\u00e0 la nostra query di inserimento, mentre l'array insert conterr\u00e0 gli elementi da inserire, per esempio se volete inserire \"nomeutente, username, password\" creeremo analogamente all'esempio precedente, un array contenenete le stringhe dei 3 elementi.<\/p>\n<p>Ecco il codice:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)inserisciValoriDaDB:(NSArray *)insert :(NSString *)sqlAdd\r\n{\r\n\t\r\n\tNSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);\r\n\tNSString *documentsDir = [documentPaths objectAtIndex:0];\r\n\tNSString *dbPath = [documentsDir stringByAppendingPathComponent:@\"nomeDB.sqlite\"];\r\n\t\r\n\tif (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) \r\n\t{\r\n\t\tif(addStmt == nil) \r\n\t\t{\r\n\t\t\tconst char *sql = [sqlAdd UTF8String];\r\n\t\t\tif(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)\r\n\t\t\t\tNSAssert1(0, @\"Error while creating add statement. '%s'\", sqlite3_errmsg(database));\r\n\t\t}\r\n\t\tfor (int k=0; k < [insert count]; k++) \r\n\t\t{\r\n\t\t\tsqlite3_bind_text(addStmt, (k+1), [[insert objectAtIndex:k ]UTF8String], -1, SQLITE_TRANSIENT);\r\n\t\t\t\r\n\t\t\tNSLog(@\"%@\", [insert objectAtIndex:k ]);\r\n\t\t}\r\n\t\t\r\n\t\tif(SQLITE_DONE != sqlite3_step(addStmt))\r\n\t\t{\r\n\t\t\tNSAssert1(0, @\"Error while inserting data. '%s'\", sqlite3_errmsg(database));\r\n\t\t}\r\n\t\tsqlite3_reset(addStmt);\r\n\t\taddStmt = nil;\r\n\t\t\r\n\t\t\r\n\t}\r\n\telse\r\n\t\tsqlite3_close(database);\r\n}\r\n<\/pre>\n<p>Le prime tre istruzioni le abbiamo gi\u00e0 viste, servono per ottenere il percorso del DB. Apriamo quindi il DB, controlliamo che lo statement per l'inserimento sia <em>nil<\/em> (questo per evitare di fare operazioni mentre se ne stanno eseguendo altre) e se lo \u00e8, procediamo con la preparazione della query nello statement.<br \/>\nFatto questo procediamo con il ciclo for. Qui prendiamo l'array che abbiamo passato al metodo (che ci indica il numero di colonne che dobbiamo inserire) e inseriamo nello statement ogni element da scrivere, a questo punto non ci resta altro che eseguire lo statement con<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nsqlite3_step(addStmt)\r\n<\/pre>\n<p>Fatto questo resettiamo lo statement e lo impostiamo a <em>nil<\/em> per poterlo riutilizzare.<\/p>\n<p>Per poter utilizzare questo metodo la nostra Stringa di query deve essere composta da due parti:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@\"INSERT INTO nomeTabella ( nomeutente, username, password) VALUES (?, ?, ?)\"\r\n<\/pre>\n<p>INSERT INTO deve essere sempre presente, seguito dal nome della tabella e tra parentesi i campi che dobbiamo inserire seguiti da VALUES, ovvero i valori che dovranno essere inseriti nello statement. Infine occorre un <em>?<\/em> per ogni valore messo dentro le parentesi e che quindi sar\u00e0 presente anche nell'array.<\/p>\n<h4>Eliminare dati dal database SQLite<\/h4>\n<p>Vediamo ora il metodo di eliminazione, molto simile a quello di inserimento.<\/p>\n<p>Nel file di intestazione (.h) dichiariamo il metodo:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)eliminaValoriDaDB:(NSString *)number :(NSString *)sqlString;\r\n<\/pre>\n<p>Le query per l'eliminazione funzionano in modo analogo a quelle di inserimento. Su number avr\u00f2 il valore da mettere dentro lo statement mentre la query sar\u00e0 dello stesso stampo di quelle per l'inserimento:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n@\"DELETE FROM nomeTabella WHERE ID =?\"\r\n<\/pre>\n<p>Usiamo sempre il simbolo <em>?<\/em> per inseirire la stringa o il valore da eliminare.<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n- (void)eliminaValoriDaDB:(NSString *)number :(NSString *)sqlString \r\n{\r\n\tNSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);\r\n\tNSString *documentsDir = [documentPaths objectAtIndex:0];\r\n\tNSString *dbPath = [documentsDir stringByAppendingPathComponent:@\"nomeDB.sqlite\"];\r\n\t\r\n\tif (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) \r\n\t{\r\n\t\tif(delStmt == nil) \r\n\t\t{\r\n\t\t\tconst char *sql = [sqlString UTF8String];\r\n\t\t\t\/\/const char *sql = [sqlDel UTF8String];\r\n\t\t\tif(sqlite3_prepare_v2(database, sql, -1, &delStmt, NULL) != SQLITE_OK)\r\n\t\t\t\tNSAssert1(0, @\"Error while creating del statement. '%s'\", sqlite3_errmsg(database));\r\n\t\t}\r\n\t\tif (![number isEqualToString:@\"\"] || number != nil) \r\n\t\t{\r\n\t\t\tsqlite3_bind_int(delStmt, 1, [number intValue]);\r\n\t\t}\r\n\t\t\r\n\t\tif (SQLITE_DONE!= sqlite3_step(delStmt)) {\r\n\t\t\tNSAssert1(0, @\"Error while deleting. '%s'\", sqlite3_errmsg(database));\r\n\t\t\t\r\n\t\t\t\r\n\t\t}\r\n\t\tsqlite3_reset(delStmt);\r\n\t\tdelStmt = nil;\r\n\t\t\r\n\r\n\t}\r\n\telse\r\n\t\tsqlite3_close(database);\r\n}\r\n<\/pre>\n<p>Come vedete il codice \u00e8 pressoch\u00e8 simile a quello per inserire i valori nel DB tranne il controllo sulla stringa <em>number<\/em> che usiamo per controllare che non sia vuota o nulla.<\/p>\n<h4>Modificare i dati (record) nel database SQLite<\/h4>\n<p>I metodi appena illustrati sono tre esempi di quello che possiamo fare con un database SQLite, volendo potremmo realizzare anche un metodo per fare l'update (ovvero l'aggiornamento di un record), cambiando semplicemente la query del metodo di inserimento.<\/p>\n<h4>Conclusioni<\/h4>\n<p>L'ultima cosa da modificare \u00e8 il <\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n+(void)finalizeStatements\r\n<\/pre>\n<p>qui dobbiamo chiudere gli statement, se sono aperti quindi diventer\u00e0:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n+(void)finalizeStatements \r\n{\r\n\tif(database)\r\n\t\tsqlite3_close(database);\r\n    if (selectstmt) {\r\n        sqlite3_finalize(selectstmt);\r\n    }\r\n\tif (addStmt) \r\n    {\r\n\t\tsqlite3_finalize(addStmt);\r\n\t}\r\n\tif (delStmt) \r\n    {\r\n\t\tsqlite3_finalize(delStmt);\r\n\t}\r\n}\r\n<\/pre>\n<p>E' tutto! Spero possa esservi utile per integrare le operazioni da fare con i vostri database SQLite.<br \/>\nAlla prossima \ud83d\ude42<br \/>\nAndrea Cappellotto<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ciao a tutti, con questo articolo riprendiamo un argomento trattato tempo fa da Andrea Busi dedicato a&#8230;<\/p>\n","protected":false},"author":136,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[216,270,619,617,618,102],"class_list":["post-6215","post","type-post","status-publish","format-standard","hentry","category-tutorial-pratici","tag-andrea-busi","tag-andrea-cappellotto","tag-eliminare-dati-sqlite","tag-inserire-dati-sqlite","tag-modificare-dati-sqlite","tag-sqlite"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6215","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\/136"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6215"}],"version-history":[{"count":21,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6215\/revisions"}],"predecessor-version":[{"id":6250,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6215\/revisions\/6250"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}