在编程过程中很多时候需要拼接字符串。在使用FMDB管理sqlite数据库,手写的SQL语句总是要拼接字符串。
各种语言有不同的字符串拼接方式,java 、c++等语言字符串拼接最为简单,直接使用“+”就搞定了。例如"select * from " + tablename + "where id=" + id 但是使用OC恶心的语法写出的代码也非常恶心。下面总结下
方法一、使用 stringWithFormat 格式化字符串
NSString*sql = [NSString stringWithFormat:"select * from %@ where id='%@'",tablename,id];
NSString*sql = [[[[@"select * from " stringByAppendingString:tablename] stringByAppendingString:@"where id='"]stringByAppendingString:id]stringByAppendingString:@"'"];
或者
NSString*sql = [@"select * from " stringByAppendingString:tablename];
sql = [sql stringByAppendingString:@"where id='"];
sql = [sql stringByAppendingString:id];
sql = [sql stringByAppendingString:@"'"];
方法三、使用 stringByAppendingFormat
这个是把方法一和方法二结合结合起来的一个方法。
一直想找个好的方法,既直观又方便。
甚至还想到用宏。
#define _SQL(x) #x
#define SQL(x) _SQL(x)
可惜所有的表名、字段名都要定义为宏,且NULL值不好处理。
最后想到使用不定长参数来拼接字符串,将上面的方法封装起来。
方法四、+ (NSString*)NStr:(NSString*) str,...
// 拼接字符串
+ (NSString*)NStr:(NSString*) str,...
{
if (!str) {
return nil;
}
NSMutableString *ret = [NSMutableString stringWithFormat:@"%@",str];
id obj = nil;
va_list args;
va_start(args, str);
while ((obj = va_arg(args, id))) {
if ([obj isKindOfClass:[NSString class]]) {
[ret appendString:obj];
} else {
NSLog(@"<NStr>:WARNING %@ is not a NSString", [obj class]);
}
}
va_end(args);
return ret;
}
// 使用
[类名 NStr:@"select * from ",tableName,@" where id='",id,@"'",nil];
虽然可以拼接字符串了,但是看着还是不怎么直观。