column为TEXT类型时,数据插入和更新时遇到的问题

  • TEXT 类型的column不包含单引号时

    正常sql语句,因TEXT类型的column不包含单引号,所以SQL语句执行正常

  1. INSERT INTO demo (uid,name,age,weight,registered,desc) VALUES (1,'GG',29,74.800000,0,'iOS 开发工程师')
  • TEXT 类型的column包含单引号时

    当TEXT类型的column包含单引号时,实际执行的语句

  1. INSERT INTO demo (uid,name,age,weight,registered,desc) VALUES (1,''GG',29,74.800000,0,'iOS 开发工程师')

遇到的问题

  1. 2021-02-19 14:07:23.151251+0800 SQLite3Demo[6126:469210] [logging] near "GG": syntax error in "INSERT INTO demo (uid,name,age,weight,registered,desc) VALUES (1,''GG'',29,74.800000,0,'iOS 开发工程师')"
  2. 2021-02-19 14:07:23.151336+0800 SQLite3Demo[6126:469210] DB Error: 1 "near "GG": syntax error"
  3. 2021-02-19 14:07:23.151428+0800 SQLite3Demo[6126:469210] DB Query: INSERT INTO demo (uid,name,age,weight,registered,desc) VALUES (1,''GG'',29,74.800000,0,'iOS 开发工程师')
  • 解决方案

    改进后的语句(创建SQL语句时,将TEXT类型文本中的单引号替换为双引号)

  1. INSERT INTO demo (uid,name,age,weight,registered,desc) VALUES (1,'''GG',29,74.800000,0,'iOS 开发工程师')

解决方案实例

  1. + (NSString *)createDemoTableSQL{
  2. return @"CREATE TABLE IF NOT EXISTS demo(uid INT PRIMARY KEY NOT NULL,name TEXT NOT NULL,age INT,weight REAL,registered BLOB,desc TEXT)";
  3. }
  4. /// 插入一条数据
  5. /// @param model model description
  6. + (BOOL)insertWithModel:(DemoModel *)model{
  7. NSString *sqlPre = @"INSERT INTO demo (uid,name,age,weight,registered,desc) VALUES ";
  8. /// 注意:
  9. /// 1. 字符串类型的value需要使用单引号引起来,否则会报错
  10. /// 2. 需要将字符串类型的单引号,变为两个单引号
  11. NSString *toSaveName = [model.name stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
  12. NSString *toSaveDesc = [model.desc stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
  13. NSString *valuesStr = [NSString stringWithFormat:@"(%ld,'%@',%ld,%f,%d,'%@')",model.uid,toSaveName,model.age,model.weight,model.registered,toSaveDesc];
  14. NSString *sql = [sqlPre stringByAppendingString:valuesStr];
  15. NSLog(@"%@",sql);
  16. BOOL res = [db executeUpdate:sql];
  17. return res;
  18. }