2014-03-14 128 views
1

我有SQL查詢了一把我的目標c項目。有什麼辦法可以將它們存儲在單獨的文件query1.sql,query2.sql,在我的樹中,並在編譯時將它們分開嗎?字符串存儲在目標C

激勵,這是事實,我的查詢不是複製pastable但不可讀(無空格):

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 \ 
... 

我所知道的目標c的.strings文件,但認爲它們更適合本地化。是對的嗎?我可以更清楚地說:我想將我的單獨的sql語句存儲在單獨的文本文件中,這些文本文件是:1)獨立的有效SQL,2)可以在編譯時導入。

+0

您可能更喜歡在此答案中使用多行字符串的宏:http://stackoverflow.com/a/17996915/3737 –

回答

0

你可以試試這個

NSString* query = 
@"SELECT A.a, B.* " 
"FROM myTable A " 
"INNER JOIN " 
"..." 

或移動的SQL字符串到文件QUERY1.SQL

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

NSString *query= @(
#include "query1.sql" 
); 
+0

此解決方案的任何變體where query1.sql是有效的SQL? – orlandpm

+0

@orlandpm你可以使用一些腳本通過在每一行上附加引號將有效的sql轉換爲c字符串幷包含翻譯後的文件。你需要額外的構建步驟來自動生成'#incldue'sql文件 –

0

我會說 「不」,但我們會看到有人不同意!

如果您準備放棄編譯時包含,只需將sql文件複製到您的包中並讀入即可。這當然是每次運行的運行時成本,但這可能不重要,但是YMMV!

另外,更涉及到的方式 - 你只需要編寫一次 - 是開發一個腳本,說,在Ruby中,其中將您的SQL文件轉換成Objective-C的來源,並把它作爲構建階段。蘋果有一個例子可以做到這一點(使用Ruby,因此Ruby的建議 - 從Apple的示例開始並編輯它)在字符串文件上運行預處理器。該方法確實工作得很好,但您需要先將努力放在第一位,然後才能在所有項目中重複使用它。

HTH

0

的宏或多行字符串的其他建議是好的,但如果你想將它們放在.strings文件,這很好。只需使用NSLocalizedStringFromTable,以便您可以指定與本地化字符串不同的字符串表。當然,不要本地化SQL。

但我可能會建立一些習俗,讀取文件和緩存的內容。建立你想要的東西大約需要十五分鐘,如果它使開發更簡單,那麼它就沒有什麼壞處。

如果您想將所有選擇的查詢存儲在它們自己的文件中(如您所說),只需使用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緩存,這樣您就不必每次都加載字符串。