我有一个很长的sqlite查询:
const char *sql_query = "SELECT statuses.word_id FROM lang1_words, statuses WHERE statuses.word_id = lang1_words.word_id ORDER BY lang1_words.word ASC";
我如何把它分成几行,让它更容易阅读?
如果我这样做:
const char *sql_query = "SELECT word_id
FROM table1, table2
WHERE table2.word_id = table1.word_id
ORDER BY table1.word ASC";
我得到一个错误。
是否有一种方法可以在多行中编写查询?
有两种方法将字符串拆分为多行:
每个字符串在自己的行上。只适用于字符串:
纯C:
char *my_string = "第一行"
“第2行”;
objective - c:
NSString *my_string = @"Line1 "
“么”;//第二个@是可选的
使用\ -可以用于任何表达式:
纯C:
char *my_string = "第一行\
第2行”;
objective - c:
NSString *my_string = @"Line1 \ .
么”;
第一种方法比较好,因为没有包含很多空白。然而,对于SQL查询,两者都是可能的。
注意:使用#define,你必须添加一个额外的\来连接两个字符串:
纯C:
#define kMyString "Line 1"\
"Line 2"
你可以用预处理器做一个小技巧。
它有潜在的缺点,它会破坏空白,并且可能会让阅读代码的人感到困惑。
但是,它也有好的一面,你不需要在里面转义引号字符。
#define QUOTE(...) #__VA_ARGS__
const char *sql_query = QUOTE(
SELECT word_id
FROM table1, table2
WHERE table2.word_id = table1.word_id
ORDER BY table1.word ASC
);
预处理器将其转换为:
const char *sql_query = "SELECT word_id FROM table1, table2 WHERE table2.word_id = table1.word_id ORDER BY table1.word ASC";
我在编写一些包含JSON的大字符串的单元测试时使用过这个技巧。这意味着我不必转义每一个引用字符\”。
还有一个解决方案,把你的。m文件改为。mm,这样它就变成了objective - c++,并使用c++原始文字,像这样:
const char *sql_query = R"(SELECT word_id
FROM table1, table2
WHERE table2.word_id = table1.word_id
ORDER BY table1.word ASC)";
原始文字忽略终止序列之前的所有内容,在默认情况下,终止序列是圆括号-引号。
如果圆括号-引号序列必须出现在字符串中的某个地方,您也可以轻松地指定一个自定义分隔符,如下所示:
const char *sql_query = R"T3RM!N8(
SELECT word_id
FROM table1, table2
WHERE table2.word_id = table1.word_id
ORDER BY table1.word ASC
)T3RM!N8";