2011-04-15 61 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(纬度,经度,海拔高度,速度,航向,时间)值(,,,,,??????)”;