0

在这里我优化了以下代码,我得到了完美的数据库路径意味着 NSLog(@"in save data::%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);

    }
}
4

1 回答 1

1

几个想法:

  1. 为什么要设置dirPathdocsDir如果您dbasePath不使用它们?这就是 uses 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_函数。有关函数示例,请参见执行“END”时锁定的 Sqlite 数据库sqlite3_bind(忽略问题,但只需查看sqlite3_bind代码示例中的语句)。这使您不必处理奇怪的异常,例如如果title字段中有双引号......这会破坏您当前的例程。它还可以保护您免受 SQL 注入攻击。这只是谨慎。

于 2012-12-27T07:29:19.643 回答