2016-05-17 4 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); 
    } 
} 

を。今

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

::のような出力で

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

:また、あなただけの出力にこのようなフォーマットされたクエリ分析をプロファイルをログアウトすることができますLIKEコマンドを支援するために、あなたが使用してオフに最適ですアウトdbMakeLike(string)機能。このように使用されます。

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

LIKE条件がオブジェクトとして渡されると、我々はあなたが我々が内部的にクエリを並べ替える方法を推測することなく、適切に区切り、それをパラメータとして扱うことができますこの方法。

+0

ありがとうございました!関数 "dbMakeLike()"はcharエスケープを実行しますか? – Patrik

+0

パラメータ文字列を '' 'xyz LIKE '%<文字列値>%'' ''に変換します。しかし、フォーマッタを通して '' '' %%% @ %% '' 'として実行する必要があります。説明は分かりにくいでしょう。 –

関連する問題