Ios5 它可以';我不在插入数据库

Ios5 它可以';我不在插入数据库,ios5,sqlite,xcode4.5,Ios5,Sqlite,Xcode4.5,在这里,我优化了以下代码,我得到了完美的数据库路径表示NSLog(@“在保存数据时::%s”,dbasePath);但在那之后,如果条件代码 -(void)saveData{ sqlite3_stmt *statment; dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); docsDir=[dirPath objectAtIndex:0];

在这里,我优化了以下代码,我得到了完美的数据库路径表示NSLog(@“在保存数据时::%s”,dbasePath);但在那之后,如果条件代码

-(void)saveData{
    sqlite3_stmt *statment;
    dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir=[dirPath objectAtIndex:0];
    const char *dbasePath=[dbPath UTF8String];
    NSLog(@"in save data::%s",dbasePath);

    if (sqlite3_open(dbasePath, &sqlDatabase)) {
        NSString *insert_query=[NSString stringWithFormat:@"INSERT INTO PRJDATA VALUES(\"%@\",\"%@\"\"%@\",\"%@\",\"%@\",\"%@\",\"%@\")",title,timeGet1.text,timeGet2.text,timeGet3.text,dateField.text,interval1.text,interval2.text];
        NSLog(@"query string::%@",insert_query);
        const char *insert_stmt=[insert_query UTF8String];
        NSLog(@"error in insert::%s",sqlite3_errmsg(sqlDatabase));
        sqlite3_prepare_v2(sqlDatabase, insert_stmt, -1, &statment, NULL);
        if (sqlite3_step(statment)==SQLITE_DONE) {
            status.text=@"content added";
            timeGet1.text=@"";
            timeGet2.text=@"";
            timeGet3.text=@"";
            dateField.text=@"";
            interval1.text=@"";
            interval2.text=@"";

        }
        else{
            status.text=@"failed to add";
        }
        sqlite3_finalize(statment);
        sqlite3_close(sqlDatabase);

    }
}
有几点想法:

  • 如果您的
    dbasePath
    不使用它们,为什么要设置
    dirPath
    docsDir
    ?这就使用了
    dbPath
    ,您可能打算根据
    docsDir
    来定义它,但是您在这里没有定义任何地方

  • 另外,您能否向我们展示您的代码样本的
    NSLog
    结果?只需相应地更新您的问题。做
    NSLog
    但不与我们分享没有意义

  • 正如我在另一个答案中所建议的,无论何时出现错误,都要显示
    sqlite3\u errmsg
    ,因为这将告诉您出了什么问题。为什么要猜测何时可以让SQLite告诉您出了什么问题?如果不显示
    sqlite3\u errmsg
    结果,你会发疯的

  • INSERT
    语句中的
    值是否反映了表中的所有列?如果没有,您应该更改
    INSERT
    语句,以包含与您的值对应的列的名称,例如

  • 您确实不应该使用
    stringWithFormat
    构建
    INSERT
    字符串。您应该使用
    占位符,然后使用
    sqlite3\u bind\u
    函数。有关
    sqlite3\u bind
    函数的示例,请参见(忽略此问题,只需查看代码示例中的
    sqlite3\u bind
    语句)。这使您不必处理奇怪的异常,例如
    title
    字段中有双引号时会发生什么情况。。。这将打破你目前的常规。它还可以保护您免受SQL注入攻击。这只是谨慎

  • INSERT INTO TABLE1 (COL1, COL2, COL3) VALUES ("VALUE1", "VALUE2", "VALUE3");