2011-04-15 56 views
0

得到錯誤:問題寫入到數據庫

- (void)viewDidLoad 

    NSString *dbName = @"TrackDate.sqlite"; 
    [dbName retain]; 

    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,            
    NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *dbPath = [docDir stringByAppendingPathComponent:dbName]; 


    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    BOOL exists = [fileManager fileExistsAtPath:dbName]; 
    if (exists == false) { 
     NSString *resourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbName]; 
     [fileManager copyItemAtPath:resourcePath toPath:dbPath error:nil]; 
     [fileManager release]; 
    } 

    sqlite3_open ([dbPath UTF8String], &database); 
} 
正在使用

變量

char *sql = "Insert into Daten (Latitude, Longitude, Altitude, Speed, Course, Time) Values (?, ?, ?, ?, ?, ?, ?)"; 
    sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL); 

    sqlite3_bind_text(addStmt, 1, [latitude UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(addStmt, 2, [longitude UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(addStmt, 3, [altitude UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(addStmt, 4, [speed UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(addStmt, 5, [course UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(addStmt, 6, [date UTF8String], -1, SQLITE_TRANSIENT); 

    if (SQLITE_DONE != sqlite3_step(addStmt)) { 
     recordLabel.text = @"Error!"; 
    } 

    sqlite3_reset(addStmt); 
} 
+0

怎麼樣告訴我們你收到了什麼「錯誤」? – Mat 2011-04-15 09:28:11

+0

是的,它通常有助於告訴我們你希望我們幫助的錯誤:) – MatBailie 2011-04-15 10:26:00

回答

1
char *sql = "Insert into Daten (Latitude, Longitude, Altitude, Speed, Course, Time) Values (?, ?, ?, ?, ?, ?, ?)"; 

你有一個錯誤SQL語句:六列,七個佔位符。

+0

非常感謝。這是原因。現在它運行得很好 – Baum 2011-04-15 09:41:19

-1
sqlite3_stmt *statement = nil; 
    char sql[1000]; 
write values according to your self. 
    sprintf(sql, "Insert into *your table name* values ('%s', '%s')",[productId UTF8String], [folderId UTF8String]); 

// path將包含數據庫位置的路徑。

NSString *path = [self GetDatabasePath] ; 
    if(sqlite3_open([path UTF8String],&database) == SQLITE_OK) 
    { 
     if((sqlite3_prepare_v2(database, sql, -1, &statement, NULL)) == SQLITE_OK) 
     { 
      //NSLog(@"%s",sql); 
      sqlite3_step(statement); 
     } 
     sqlite3_finalize(statement); 
    } 
    sqlite3_close(database); 

快樂編碼!

+0

您提出的代碼比提問者的安全性要低。您的版本可能會溢出sql [1000]',並且容易受到SQL注入的影響。在沒有佔位符的聲明中使用「準備」並不真正使感覺。 – Mat 2011-04-15 09:36:22

0

您傳遞六個字段名稱並分配七個值。

替換此

的char * SQL = 「INSERT INTO回到名單Daten(緯度,經度,海拔高度,速度,航向,時間)值(,,,,,,???????)」;

的char * SQL = 「INSERT INTO回到名單Daten(緯度,經度,海拔高度,速度,航向,時間)值(,,,,,??????)」;