2011-09-15 19 views
10

Sto provando a lavorare su un'app iOS che consente agli utenti di sincronizzare i loro database SQLite tramite Bluetooth utilizzando GameKit. C'è un modo per eseguire l'equivalente di .dump sulla shell sqlite usando una delle tante librerie sqlite-obiettivo-c?Esiste un equivalente sqlite .dump nell'obiettivo-c?

+1

Non esiste una classe pronta all'uso per questo comando di dump finora. Non dovrebbe essere troppo difficile leggere tutte le tabelle e generare un dump.sql con le posizioni INSERT. –

+1

Qualcosa che potrebbe aiutarti: puoi ottenere il catalogo delle tabelle facendo una query alla tabella di sistema 'sqlite_master' (ad esempio, "SELEZIONA * DA sqlite_master;"). Se si esegue iterazione sui risultati, è possibile ottenere il nome della tabella dal campo 'tbl_name' e il campo 'sql' contiene l'istruzione 'CREATE TABLE'. Analizza quest'ultimo per ottenere i nomi dei campi. – mpemburn

risposta

-1

Non credo. Ma, è possibile eseguire un'istruzione SELECT * e poi iterare su argc nella funzione di callback.

Qualcosa di simile

void callback (void *param, int argc, char **argv, char **azColName) 
{ 
    for(int i=0;i<argc;i++) 
    { 
     get ... azColName[i] ... argv[i] 
    } 
} 
+0

Puoi ampliare questa risposta per dare un po 'più di contesto? Penso di capire più o meno quello che stai dicendo, ma non sono abbastanza sicuro di come funzionerebbe in una vera app. – buildsucceeded

3

È possibile creare un file di backup del database, inviare che più e poi fare la fusione sul dispositivo di destinazione. Il codice per creare il file di backup è il seguente:

- (void) exportDB { 

    sqlite3 *sourceDB, *destinationDB; 
    sqlite3_backup *sql3Backup; 

    NSString *sourceDBPath = @"/path/to/source/database"; 
    NSString *destinationDBPath = @"/path/to/destination/database"; 

    if(sqlite3_open([sourceDBPath UTF8String],&sourceDB) != SQLITE_OK){ 
     NSLog(@"%s\n",sqlite3_errmsg(sourceDB)); 
     return ; 
    } 

    if(sqlite3_open([destinationDBPath UTF8String],&destinationDB) != SQLITE_OK){ 
     sqlite3_close(sourceDB); 
     NSLog(@"%s\n",sqlite3_errmsg(destinationDB)); 
     return; 
    } 

    sql3Backup = sqlite3_backup_init(destinationDB,"main",sourceDB,"main"); 
    if(sql3Backup == NULL){ 
     sqlite3_close(sourceDB); 
     sqlite3_close(destinationDB); 
     NSLog(@"%s\n",sqlite3_errmsg(destinationDB)); 
     return; 
    } 

    if(sqlite3_backup_step(sql3Backup, -1) != SQLITE_DONE){ 
     NSLog(@"%s\n",sqlite3_errmsg(destinationDB)); 
     return; 
    } 

    if(sqlite3_backup_finish(sql3Backup) != SQLITE_OK){ 
     NSLog(@"%s\n",sqlite3_errmsg(destinationDB)); 
     return; 
    } 

    sqlite3_close(sourceDB); 
    sqlite3_close(destinationDB); 
}