这里我优化了以下代码我完全达到数据库路径意味着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);
}
}
答案 0 :(得分:1)
有几点想法:
如果您的dirPath
不使用它们,为什么设置docsDir
和dbasePath
?这是使用dbPath
,你可能想要根据docsDir
来定义,但你没有在这里定义。
另外,您能否向我们展示您的代码示例中的NSLog
结果?只需相应更新您的问题。没有必要做NSLog
但不与我们分享。
正如我在其他答案中所建议的,每当您收到错误时,请显示sqlite3_errmsg
,因为这会告诉您出了什么问题。为什么猜你什么时候能让SQLite告诉你什么是错的?如果你没有显示sqlite3_errmsg
结果,你就会疯狂。
VALUES
语句中的INSERT
是否反映了表格的所有列?如果没有,您应该更改INSERT
语句,以包含与您的值对应的列的名称,例如
INSERT INTO TABLE1 (COL1, COL2, COL3) VALUES ("VALUE1", "VALUE2", "VALUE3");
您真的不应该使用INSERT
构建stringWithFormat
字符串。您应该使用?
占位符,然后使用sqlite3_bind_
函数。有关sqlite3_bind
函数的示例,请参阅Sqlite database locked when executing "END"(忽略该问题,但只需查看代码示例中的sqlite3_bind
语句)。这样可以避免处理奇怪的异常,例如title
字段中有双引号...这会破坏您当前的例程。它还可以保护您免受SQL注入攻击。这是谨慎的。