INSERT OR REPLACE不会更新SQLITE中的记录

时间:2011-06-20 22:45:23

标签: iphone objective-c sqlite

我试图在数据库中插入记录,每当我这样做时,它会在数据库中插入两次记录。 我使用以下查询来执行我的插入:

-(void) insert {
      NSString *sqlQuery = [NSString stringWithFormat:@"INSERT OR REPLACE INTO test(ID,KEY ) VALUES ('%d','%@');", test.id, test.key];
      const char *insert_sql = [sqlQuery UTF8String];
      sqlite3_exec(db, insert_sql, NULL, NULL, NULL);
}

每次运行此查询时,它始终会输入重复的记录。有没有办法检查数据是否已经存在,然后不要插入只是更新。

2 个答案:

答案 0 :(得分:3)

您正在使用stringWithFormat:初始化SQL字符串,但您传递的字符串不是格式字符串。 ?参数只能由sqlite解析器识别。

您可以通过用

替换SQL字符串来解决此问题
// Assuming id is an int and key is a string
NSString *sqlQuery = [NSString stringWithFormat:@"INSERT OR REPLACE INTO test(ID,KEY ) VALUES (%d,%@);", test.id, test.key];

或者您需要调用sqlite prepare / bind函数将参数绑定到通配符。为此,请参阅preparebind文档。

我建议采用第二种方法,因为这会阻止SQL注入。

答案 1 :(得分:1)

ID是表的主键还是其他索引?它必须是唯一的替代品才能发生。