我有一个很长的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";

我得到一个错误。

是否有一种方法可以在多行中编写查询?


当前回答

你可以用预处理器做一个小技巧。 它有潜在的缺点,它会破坏空白,并且可能会让阅读代码的人感到困惑。 但是,它也有好的一面,你不需要在里面转义引号字符。

#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的大字符串的单元测试时使用过这个技巧。这意味着我不必转义每一个引用字符\”。

其他回答

我一直都有这个问题,所以我做了一个小工具,将文本转换为一个转义的多行Objective-C字符串:

http://multilineobjc.herokuapp.com/

希望这能为您节省一些时间。

还有一个解决方案,把你的。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";

你也可以进入XCode ->首选项,选择缩进选项卡,然后打开行换行。

这样,你就不需要输入任何额外的东西,它将适用于你已经写过的东西。: -)

但有一件事很烦人……

if (you're long on indentation
    && short on windows) {
            then your code will
                end up squished
                     against th
                         e side
                             li
                              k
                              e

                              t
                              h
                              i
                              s
}

在Objective-C中扩展引用思想:

#define NSStringMultiline(...) [[NSString alloc] initWithCString:#__VA_ARGS__ encoding:NSUTF8StringEncoding]

NSString *sql = NSStringMultiline(
    SELECT name, age
    FROM users
    WHERE loggedin = true
);

你还可以:

NSString * query = @"SELECT * FROM foo "
                   @"WHERE "
                     @"bar = 42 "
                     @"AND baz = datetime() "
                   @"ORDER BY fizbit ASC";