Home > Apple > iPhone e SQLite

iPhone e SQLite

November 10th, 2009

Una modalità molto comoda su iPhone/iPod Touch per gestire una piccola base dati locale è quella d’usare SQLite, un piccolo ma potente db relazionale supportato nativamente dal cellulare di Cupertino.

Il primo passo è quello di creare un progetto di applicazione per iPhone OS, che per semplicità può essere una Window-based-Application. Successivamente sarà necessario aggiungere la libreria dinamica di SQLite: Target->Nome applicazione->tasto destro del mouse->Get Info e scegliere dal pannello successivo il tab general. A questo punto cliccando sull’icona “+” è possibile scegliere dalla lista la libreria desiderata, ovvero:

libsqlite3.0.dylib

ecco di seguito i passi successivi:

  • Creare a riga di comando o con uno dei vari tool grafici un DB SQLite ed aggiungerlo al progetto
  • “Copiare” programmaticamente il DB locale nella cartella “Documents” dell’iPhone:
NSArray * searchPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
  NSUserDomainMask, YES);
NSString * documentFolderPath = [searchPath objectAtIndex:0];
NSString * dbFilePath = [documentFolderPath
  stringByAppendingPathComponent:@"data.db"];

if (![[NSFileManager defaultManager] fileExistsAtPath:dbFilePath]) {
  NSString * backupDbPath = [[NSBundle mainBundle]
    pathForResource:@"data" ofType:@"db"];

  if (backupDbPath == nil)
    NSLog(@"Impossibile trovare il database originale!");
  else {
    BOOL copiedBackupDb = [[NSFileManager defaultManager] copyItemAtPath:
        backupDbPath toPath:dbFilePath error:nil];

    if (!copiedBackupDb)
      NSLog(@"Impossibile copiare il database originale!");
  }
}
  • Ora finalmente possiamo scrivere il codice per accedere ai dati contenuti nelle tabelle:
sqlite3 * db;
int dbrc;
const char * dbFilePathUTF8 = [dbFilePath UTF8String];

dbrc = sqlite3_open(dbFilePathUTF8, &db);
if (dbrc)
  NSLog(@"Non posso aprire il database!");
else {
  sqlite3_stmt * dbps;
  NSString * queryNS = [NSString stringWithString:@"SELECT * FROM mia_tabella"];
  const char * query = [queryNS UTF8String];

  if (sqlite3_prepare_v2(db, query, -1, &dbps, NULL) == SQLITE_OK) {
    while (sqlite3_step(dbps) == SQLITE_ROW)
      NSLog(@"%d %s", sqlite3_column_int(dbps, 0), sqlite3_column_text(dbps, 1));
  }
}

Ovviamente in ogni file sorgente in cui è necessario accedere alle API di SQLite è necessario importare l’header:

#include <sqlite3.h>

Il passo successivo potrebbe essere quello di usare il CoreData al posto di un accesso diretto al database, ma questa è un’altra storia :-)

Author: gennaro.tangari Categories: Apple Tags:
  1. No comments yet.
You must be logged in to post a comment.