Objective c 目标C中的字符串存储

Objective c 目标C中的字符串存储,objective-c,Objective C,我的objective-c项目中有一些SQL查询。有什么方法可以将它们存储在树中单独的文件query1.sql、query2.sql中,并在编译时将它们分为子文件 促使我这样做的原因是,我的查询要么是可复制的,要么是不可读的,没有空格: NSString* query = @"SELECT A.a, B.* from myTable A INNER JOIN otherTable B ON ... 或可读,但布满线拼接: NSString* query = @"SELECT A.a, B.*

我的objective-c项目中有一些SQL查询。有什么方法可以将它们存储在树中单独的文件query1.sql、query2.sql中,并在编译时将它们分为子文件

促使我这样做的原因是,我的查询要么是可复制的,要么是不可读的,没有空格:

NSString* query = @"SELECT A.a, B.* from myTable A INNER JOIN otherTable B ON ...
或可读,但布满线拼接:

NSString* query = @"SELECT A.a, B.* \
FROM myTable A 
INNER JOIN \
...
我知道.strings文件用于objective c,但我认为它们更适合本地化。是这样吗

编辑:我可以说得更清楚一些:我想将我的单个sql语句存储在单独的文本文件中。分别是有效的SQL和2。可以在编译时导入。

您可以尝试此方法

NSString* query = 
@"SELECT A.a, B.* "
"FROM myTable A "
"INNER JOIN "
"..."
或者将sql字符串移动到文件query1.sql

"SELECT A.a, B.* "
"FROM myTable A "
"INNER JOIN "
"..."


我要说不,但我们要看看有没有人不同意

如果您准备放弃编译时包含,只需将sql文件复制到包中并读入即可。这当然是每次运行的运行时成本,但这可能并不重要,但是YMMV

另一种更为复杂的方法——但只需编写一次——是开发一个脚本,比如用Ruby编写的脚本,它将SQL文件转换为Objective-C源代码,并将其作为构建阶段包含。苹果有一个使用Ruby的例子,因此建议使用Ruby——从苹果的示例开始,编辑它,在字符串文件上运行预处理器。这种方法确实工作得很好,但您需要首先投入精力,然后才能在所有项目中重用它


HTH

对于宏或多行字符串的其他建议很好,但是如果您想将它们放在.strings文件中,也可以。只需使用NSLocalizedStringFromTable,就可以指定不同于本地化字符串的字符串表。当然,不要本地化SQL

但我可能会构建一些自定义的东西来读取文件并缓存其内容。构建您想要的东西可能需要大约15分钟,如果它能使开发变得更简单,那也没有什么坏处

如果您想像您所说的那样将所有select查询存储在它们自己的文件中,只需使用NSBundle通过某种令牌加载并查找资源文件。比如:

NSString * SQL(NSString *key) {
  NSString *path = [[NSBundle mainBundle] pathForResource:key ofType:@"sql"];
  return [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
}

NSString * const SELECT_EM = @"SELECT_EM";

NSString *select_query = SQL(SELECT_EM);
然后在资源目录中有一个名为SELECT_EM.sql的文件


同样,有很多选择;他们都很好。如果您经常调用SQL,您可能应该为它们添加一个NSDictionary缓存,这样您就不必每次都加载字符串。

此解决方案的任何变体,其中query1.SQL是有效的SQL?@orlandpm您可以使用一些脚本将有效的SQL翻译为c字符串,方法是在每行添加引号,并包含翻译后的文件。您需要一个额外的构建步骤来自动生成可包含的sql文件。您可能更喜欢对多行字符串使用宏,如下所示:
NSString * SQL(NSString *key) {
  NSString *path = [[NSBundle mainBundle] pathForResource:key ofType:@"sql"];
  return [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:NULL];
}

NSString * const SELECT_EM = @"SELECT_EM";

NSString *select_query = SQL(SELECT_EM);