2011-09-15 12 views
10

Estoy tratando de trabajar en una aplicación iOS que permita a los usuarios sincronizar sus bases de datos sqlite a través de Bluetooth utilizando GameKit. ¿Hay alguna manera de realizar el equivalente de .dump en el shell sqlite usando cualquiera de las muchas bibliotecas sqlite objetivo-c?¿Hay un equivalente sqlite .dump en objetivo-c?

+1

No existe una clase lista para usar para este comando de volcado hasta el momento. No debería ser demasiado difícil leer todas las tablas y generar un dump.sql con los staements INSERT. –

+1

Algo que podría ayudar: Puede obtener el catálogo de tablas haciendo una consulta a la tabla del sistema 'sqlite_master' (es decir, "SELECT * FROM sqlite_master;"). Si itera sobre los resultados, puede obtener el nombre de la tabla del campo 'tbl_name' y el campo 'sql' contiene la instrucción 'CREATE TABLE'. Parse el último para obtener los nombres de campo. – mpemburn

Respuesta

-1

No lo creo. Pero, podría ejecutar una instrucción SELECT * y luego iterar sobre argc en la función de devolución de llamada.

Algo así como

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

¿Puedes ampliar esta respuesta para dar un poco más de contexto? Creo que entiendo más o menos lo que dices, pero no estoy muy seguro de cómo funcionaría en una aplicación real. – buildsucceeded

3

Se puede crear un archivo de base de datos de copia de seguridad, que envíe una y luego hacer la fusión en el dispositivo de destino. El código para crear el archivo de copia de seguridad es el siguiente:

- (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); 
}