2012-07-31 61 views
3

我發現了很多關於在iOS中使用SQLite數據庫的教程,但沒有發現任何直接引用.sql文件的教程。任何人都可以告訴我如何將現有的SQL數據庫鏈接到我的應用程序?如何在iOS項目中添加和執行.sql文件?

編輯:這是一個MySQL轉儲。我們有一個基於瀏覽器的閃存卡程序,我們現在正在爲Android和iOS設備進行復制。該文件已經有用於創建表格和填充數據的語句,但我不知道如何在應用程序中使用該數據。我可能想使用NSSearchPathForDirectoriesInDomains?

+0

你是什麼樣的sql文件?像SQL轉儲?或sqlite數據庫? – 2012-07-31 23:42:57

+0

您通常不會在應用程序中使用.sql文件。如果你有SQL文件,例如,創建表並可能填充數據,你可以使用'sqlite3'或其他一些sqlite數據庫實用程序,並在Mac上執行SQL,從而創建一個sqlite數據庫,然後可以使用它你的iOS應用程序。但該應用程序本身不使用.sql文件。請注意,sqlite的SQL與其他數據庫引擎不完全相同,所以如果它是爲另一個數據庫引擎設計的,您可能需要調整.sql文件。 – Rob 2012-07-31 23:45:37

+0

你必須告訴我們你的.sql文件的目的是什麼,然後我們可以更好地建議你如何使用它。 – Rob 2012-07-31 23:47:06

回答

3

我將腳本作爲iOS項目的一部分執行。我這樣做的原因是創建數據庫模式的同一系列腳本也會更新數據庫模式(在發佈之後,運行新的增量腳本以將模式拉向前方)。它在這裏詳細解釋:

SQLITE with Android (best methodology for setting up a database)

我添加腳本作爲項目的資源,然後執行它。有一些EXxxx日誌記錄調用,但通用。注意tail-sqlite的使用在腳本循環時執行一個語句,尾部作爲它停留的標記。這裏是我用來執行的功能:

- (BOOL)executeScript:(NSString *)contents error:(NSError **)error 
{ 
    ENHeading(@"executeScript"); 

    sqlite3_stmt *stmt = NULL; 
    const char *zTail; 
    int rc; 

    zTail = [contents UTF8String]; 

    while(zTail != NULL && 0 < strlen(zTail)) 
    { 
     ENDebug("zTail: \"%s\"\n", zTail); 

     NSString *tailStr = [NSString stringWithUTF8String:zTail]; 
     NSString *trimmed = [tailStr stringByTrimmingCharactersInSet: 
          [NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

     if ([trimmed length] == 0) 
     { 
      ENInfo("ignoring trailing whitespace"); 
      break; 
     } 

     // Temporarily hold this until the end of the loop in case we need to report an error 
     const char *newzTail; 

     rc = sqlite3_prepare_v2(_sqlite3, zTail, -1, &stmt, &newzTail); 
     if(SQLITE_OK != rc) 
     { 
      ENError(@"prepare err:%@", [self errorMessage]); 
      if (error != NULL) { 
       *error = [[[ENSqliteError alloc] initWithErrorCode:ENSqliteErrorInvalidSql 
                  reason:[self errorMessage]] autorelease]; 
      } 

      return NO; 
     } 

     rc = sqlite3_step(stmt); 
     ENDebug(@"rc=%d", rc); 
     switch (rc) 
     { 
      case SQLITE_ROW: 
       ENError(@"statement returns rows, script ignores"); 
       break; 

      case SQLITE_OK: 
      case SQLITE_DONE: 
       break; 

      default: 
       ENError(@"error"); 
       ENError(@"prepare err:%@", [self errorMessage]); 
       if (error != NULL) { 
        *error = [[[ENSqliteError alloc] initWithErrorCode:ENSqliteErrorReadingRows 
                   reason:[self errorMessage]] autorelease]; 
       } 

       return NO; 
     } 

     // For next time around the loop 
     zTail = newzTail; 

     // Clear up since we're about to prepare another 
     sqlite3_finalize(stmt); 
    } 

    return YES; 
} 
相關問題