通过UITableView保存到SQLITE3时出现奇怪的行为

时间:2013-03-28 15:24:12

标签: ios objective-c uitableview sqlite

我无法理解为什么我的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);

以上所有内容都会返回正确的值。

我不确定您为此决议需要哪些其他信息?

由于

托马斯

2 个答案:

答案 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,所以它会告诉我到底出了什么问题。如果你不看这些错误信息,就会失明。