2011-09-15 22 views
10

我正在嘗試一個iOS應用程序,它允許用戶通過使用GameKit的藍牙同步他們的sqlite數據庫。有沒有一種方法可以在sqlite shell上使用任何一種sqlite objective-c庫來執行.dump的等效功能?在objective-c中有一個相當於sqlite.dump的嗎?

+1

到目前爲止,此轉儲命令沒有準備使用的類。讀取所有表並使用INSERT staements生成dump.sql應該不會太困難。 –

+1

可能有所幫助:可以通過查詢系統表'sqlite_master'(即「SELECT * FROM sqlite_master;」)來獲取表的目錄。如果迭代結果,則可以從'tbl_name'字段獲取表名,'sql'字段包含'CREATE TABLE'語句。解析後者以獲取字段名稱。 – mpemburn

回答

-1

我不這麼認爲。但是,您可以執行SELECT *語句,然後在回調函數中遍歷argc。

喜歡的東西

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

你可以擴大這個答案給更多的上下文嗎?我想我或多或少知道你在說什麼,但我不太確定它在實際應用程序中的工作方式。 – buildsucceeded

3

您可以創建一個備份數據庫文件,發送過來,然後做在目標設備上的合併。創建備份文件的代碼如下所示:

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