2012-12-26 31 views
2

我在Xcode中使用以下代碼創建數據庫。它可以順利運行到NSFilemanager代碼,但在此之後,它將終止到代碼爲else的代碼[email protected]"failed to open/create database";,因此無法創建表。 我輸入了sqlite3.h並創建了sqlDatabase參考變量sqlite3仍然不起作用。使用sqlite在xcode中爲表創建表失敗

-(void)databaseCreate 
{ 
    NSString *docsDir; 
    NSString *dbPath; 
    NSArray *dirPath; 

    dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES); 
    NSLog(@"dirpath::%@",dirPath); 

    docsDir=[dirPath objectAtIndex:0]; 
    NSLog(@"document directory::%@",docsDir); 
    dbPath=[[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent:@"timerpro1.db"]]; 

    NSLog(@"database path::%@",dbPath); 
    NSFileManager *fileManager=[NSFileManager defaultManager]; 

    if([fileManager fileExistsAtPath: dbPath] == NO) 
    { 
     const char *databsPath=[dbPath UTF8String]; 
     NSLog(@"treat filemanager"); 


     if(sqlite3_open(databsPath,&sqlDatabase) == SQLITE_OK) 
     { 
      char *err; 
      NSLog(@"create inside"); 
      const char *sql_stmt="CREATE TABLE IF NOT EXISTS PRJDATA(ID INTEGER PRIMERY KEY AUTOINCREMENT,PRJ_NAME TEXT,PRJ_DATE TEXT,TIME_POINT1 TEXT,TIME_POINT2 TEXT,TIME_POINT3 TEXT,POINT2_DIFF_MIN TEXT,POINT2_DIFF_SEC TEXT,POINT3_DIFF_MIN TEXT,POINT3_DIFF_SEC TEXT)"; 

      if (sqlite3_exec(sqlDatabase, sql_stmt, NULL, NULL, &err)!=SQLITE_OK) 
      { 
       [email protected]"failed to create table"; 
      } 
      sqlite3_close(sqlDatabase); 
     } 
     else 
     { 
      [email protected]"failed to open/create database"; 
     } 
    } 
    [fileManager release]; 
} 

回答

1

眼前的問題是,你有NSDocumentDirectory更換參考NSDocumentationDirectory

兩個旁白:

  1. 當你失敗,你應該檢查sqlite3_errmsg(),你經常會得到錯誤的描述。例如,即使您修復了NSDocumentDirectory錯誤,您的sqlite3_exec()語句也會失敗。

    如果您看到sqlite3_errmsg()錯誤消息,它會告訴您在AUTOINCREMENT子句附近有錯誤。如果仔細查看SQL,您會注意到您拼寫錯誤PRIMARY KEY。在缺少sqlite3_errmsg()的情況下,這會更難以找到,這會將我們的注意力引向SQL的特定部分。

  2. 可以簡化聲明:

    dbPath=[docsDir stringByAppendingPathComponent:@"timerpro1.db"];` 
    
+0

感謝羅布它工作正常.. –

+0

當我用sqlite3_errmsg();在上面提到的代碼中,那麼它會生成日誌,如**庫例程稱爲失序序列**沒有任何其他錯誤獲取表也創建。 –

+0

@hirangsheth這是文檔不得不說[關於不按順序的庫例程](http://sqlite.org/cvstrac/wiki?p=LibraryRoutineCalledOutOfSequence)。總之,這意味着你調用'sqlite3'函數的順序錯誤。你上面的問題的代碼(用我上面的兩個修補程序),對我來說工作得很好,所以我猜你已經改變了你的代碼了?也許在關閉數據庫後嘗試另一個'sqlite3'函數?如果解決方案沒有在你身上跳躍,也許你可以在新問題中發佈該代碼。 – Rob