Ios5 它可以';我不在插入数据库
在这里,我优化了以下代码,我得到了完美的数据库路径表示NSLog(@“在保存数据时::%s”,dbasePath);但在那之后,如果条件代码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];
-(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");