1

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

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

我不确定您需要哪些其他信息来解决此问题?

谢谢

托马斯

4

2 回答 2

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

于 2013-03-28T15:33:19.507 回答
1

通常建议不要使用 构建 SQL 语句stringWithFormat,而是使用?占位符。这可以保护您,以防其中一个值包含撇号。它还可以防止 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,所以它会准确地告诉我出了什么问题。如果你不看这些错误信息,你就瞎了眼。

于 2013-03-28T16:01:01.870 回答