我无法理解为什么我的sqlite3 insert命令只保存某些index.rows
目前,当用户选择表格中的特定行时,将开始以下命令
NSMutableString * videoString = [self.filteredVideoArray objectAtIndex:indexPath.row];
NSMutableString * imageString = [self.filteredImageArray objectAtIndex:indexPath.row];
NSMutableString * titleString = [self.filteredTitleArray objectAtIndex:indexPath.row];
NSString * descriptionString = [self.filteredDescriptionArray objectAtIndex:indexPath.row];
NSString *sql = [NSString stringWithFormat:@"INSERT INTO Recent ('name', 'title', 'video', 'image', 'detail' ) VALUES ('%s','%s','%s','%s','%s')", [self.nameString UTF8String],[titleString UTF8String],[videoString UTF8String],[imageString UTF8String] ,[descriptionString UTF8String],NULL];
char *err;
if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) !=SQLITE_OK) {
sqlite3_close(db);
// NSAssert(0, @"could not update table");
}
else{
NSLog(@"table updated");
}
当我的NSLOG
NSLog(@"video = %@",videoString);
NSLog(@"image = %@",imageString);
NSLog(@"detail = %@",descriptionString);
NSLog(@"title = %@",titleString);
NSLog(@"name = %@",self.nameString);
以上所有内容都会返回正确的值。
我不确定您为此决议需要哪些其他信息?
由于
托马斯
答案 0 :(得分:1)
在Insert
字符串中使用"%@"
代替"%s"
添加值。
NSString *sql = [NSString stringWithFormat:@"INSERT INTO Recent ('name', 'title', 'video', 'image', 'detail' ) VALUES ('%@','%@','%@','%@','%@')", [self.nameString UTF8String],[titleString UTF8String],[videoString UTF8String],[imageString UTF8String] ,[descriptionString UTF8String]];
并从NULL
字符串末尾删除Insert
。
答案 1 :(得分:1)
通常建议不要使用stringWithFormat
构建SQL语句,而是使用?
占位符。这可以保护您,以防其中一个值包含撇号。它还可以防止SQL注入攻击。因此你应该
NSString *sql = @"INSERT INTO Recent ('name', 'title', 'video', 'image', 'detail' ) VALUES (?,?,?,?,?)";
sqlite3_stmt *statement;
if (sqlite3_prepare(db, [sql UTF8String], -1, &statement, NULL) != SQLITE_OK)
{
NSLog(@"%s: prepare error: %s", __FUNCTION__, sqlite3_errmsg(database));
return;
}
if (sqlite3_bind_text(statement, 1, [self.nameString UTF8String], -1, NULL) != SQLITE_OK)
{
NSLog(@"%s: bind 1 error: %s", __FUNCTION__, sqlite3_errmsg(database));
}
if (sqlite3_bind_text(statement, 2, [titleString UTF8String], -1, NULL) != SQLITE_OK)
{
NSLog(@"%s: bind 2 error: %s", __FUNCTION__, sqlite3_errmsg(database));
}
// repeat for the other parameters
if (sqlite3_step(statement) != SQLITE_DONE)
{
NSLog(@"%s: step error: %s", __FUNCTION__, sqlite3_errmsg(database));
}
sqlite3_finalize(statement);
注意,除了使用sqlite3_bind_text
函数之外,每当我没有收到成功的返回码时,我都会记录sqlite3_errmsg
,所以它会告诉我到底出了什么问题。如果你不看这些错误信息,就会失明。