2016-05-17 27 views
1

我使用委託函數依奧斯DBACCESS查詢調試

<pre> 
- (void)queryPerformedWithProfile:(DBQueryProfile*)profile 
{ 
    NSLog(@"QUERY: %@", profile.compiledQuery); 
    NSLog(@"RESULTS: %i", profile.rows); 
} 
</pre> 

嘗試調試查詢,但是日誌顯示此:

<pre> 
2016-05-17 10:04:08.426 AppName[19301:410138] QUERY: (null) 
2016-05-17 10:04:08.426 AppName[19301:410138] RESULTS: 0 
</pre> 

CompiledQuery和行似乎未初始化。 我需要啓用調試嗎?我使用AppDelegate作爲委託。

我需要調試查詢,因爲我有一個問題,包含LIKE子句的查詢:

 
DBResultset* result = [[[User query] whereWithFormat:@"type=%@ AND (name LIKE '%@%' OR surname LIKE '%@%')", @(kindId), strFilter, strFilter] fetch]; 

也許我做錯事與我的查詢。

回答

1

有趣的是,如果出現錯誤,這可能是剖析器中的一個錯誤,我們將測試它,並儘快修復它。

但是你想被實施方法:

- (void)databaseError:(DBError *)error { 
    if (error) { 
     NSLog(@"%@",error.errorMessage); 
    } 
} 

要找到任何語法錯誤。此外,你可以註銷該配置文件輸出格式查詢分析是這樣的:

- (void)queryPerformedWithProfile:(DBQueryProfile *)profile { 
    if (profile.queryTime > 1000) { 
     NSLog(@"%@",profile); 
    } 
} 

有了這樣的輸出:

DB Query Profiler 
------------------------------------------------------------------------------------------ 
Query Time:1212 ms Lock Wait:0 ms Parse Time:0 ms Seek Time:1211 ms Row Count:1 
------------------------------------------------------------------------------------------ 
SQL Query 
------------------------------------------------------------------------------------------ 
SELECT DataForm.Id as result$Id, DataForm.completedDateTimeUTC as result$completedDateTimeUTC, DataForm.contentSetId as result$contentSetId, DataForm.submitted as result$submitted, DataForm.loginId as result$loginId, DataForm.resourceId as result$resourceId, DataForm.formData as result$formData, DataForm.submitGuid as result$submitGuid FROM DataForm WHERE submitGuid = ? LIMIT 1 
------------------------------------------------------------------------------------------ 
SQLITE3 QUERY PLAN 
------------------------------------------------------------------------------------------ 
Order:0 From:0 Usage: SCAN TABLE DataForm 
------------------------------------------------------------------------------------------ 

現在:爲了幫助與LIKE命令,你是最好的關閉使用出dbMakeLike(string)功能。像這樣使用。

whereWithFormat:@"lower(text) LIKE %@「, dbMakeLike(searchString.lowercaseString) 

這樣,LIKE條件被傳遞作爲對象,我們可以把它當作一個正確分隔參數,沒有你猜我們如何重新排列查詢內部。

+0

感謝回覆!函數「dbMakeLike()」執行char轉義嗎? – Patrik

+0

它將參數字符串轉換爲''''xyz LIKE'%%''''。但是我們需要它通過格式化程序以%%% @ %%'''的格式運行它,這會令人困惑的解釋。 –