它不能用于插入数据库

时间:2012-12-27 07:12:39

标签: ios5 sqlite xcode4.5

这里我优化了以下代码我完全达到数据库路径意味着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);

    }
}

1 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 如果您的dirPath不使用它们,为什么设置docsDirdbasePath?这是使用dbPath,你可能想要根据docsDir来定义,但你没有在这里定义。

  2. 另外,您能否向我们展示您的代码示例中的NSLog结果?只需相应更新您的问题。没有必要做NSLog但不与我们分享。

  3. 正如我在其他答案中所建议的,每当您收到错误时,请显示sqlite3_errmsg,因为这会告诉您出了什么问题。为什么猜你什么时候能让SQLite告诉你什么是错的?如果你没有显示sqlite3_errmsg结果,你就会疯狂。

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

    INSERT INTO TABLE1 (COL1, COL2, COL3) VALUES ("VALUE1", "VALUE2", "VALUE3");
    
  5. 您真的不应该使用INSERT构建stringWithFormat字符串。您应该使用?占位符,然后使用sqlite3_bind_函数。有关sqlite3_bind函数的示例,请参阅Sqlite database locked when executing "END"(忽略该问题,但只需查看代码示例中的sqlite3_bind语句)。这样可以避免处理奇怪的异常,例如title字段中有双引号...这会破坏您当前的例程。它还可以保护您免受SQL注入攻击。这是谨慎的。