1

私のsqlite3挿入コマンドが特定の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

一般に、 を使用して 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 に答える
1

あなたの文字列では、値を追加するためにinstand を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 に答える