2012-09-05 3 views
1

안녕하세요. 모든 사람들이 ios의 sqlite에 대해 잘 모릅니다. 나는 단어/문장 검색을 위해 질의를 사용하고있다. 같은 단어가있을 때까지 아래 위의 코드를 제대로 활용sqlite와 같은 쿼리가 충돌을 일으킴

 -(NSArray *)prepareSearchResultsForQuery:(NSString *)searchString{ 

     searchQueryString = searchString; 

     sqlite3_stmt *searchResultsStmt; 
     NSMutableArray *arrayOfSearchResults; 
     NSString *searchResultsQuery = [NSString stringWithFormat:@"SELECT * FROM Search WHERE pageText LIKE '%%%@%%'",searchString]; 
     if (sqlite3_prepare_v2(bookDB,[searchResultsQuery UTF8String],-1,&searchResultsStmt,nil) == SQLITE_OK) { 
      arrayOfSearchResults = [[NSMutableArray alloc]initWithCapacity:1]; 

      while (sqlite3_step(searchResultsStmt) == SQLITE_ROW) { 
       XPathSearchResult *xpathObj = [[XPathSearchResult alloc] init]; 
       xpathObj.targetPageIndex = sqlite3_column_int(searchResultsStmt, 2); 
       NSString *entirePageString = [[[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(searchResultsStmt, 4)] autorelease]; 
       xpathObj.stringContainingSearchQuery = [self getDisplayStringFromPageString:entirePageString]; 

       [arrayOfSearchResults addObject:xpathObj]; 
       [xpathObj release]; 

      } 
     } 
     sqlite3_finalize(searchResultsStmt); 
     return arrayOfSearchResults; 
    } 
    } 

기록을 검색하는 내 샘플 코드는 그것의 무엇이다 지구의 단어가 "" '작동하지 않는 < 문자 내 방법이 포함 된 경우

. 그리고 이제 우리는이 문제에서 벗어나기 위해 준비된 성명서를 사용해야한다는 사실을 알게되었습니다.이 상황에서 준비된 성명서를 사용하는 방법을 제안 할 수있는 사람이 있습니까? 사전에 감사드립니다.

+0

searchString에'''가 포함되어 있으면 두 배가되어야합니다. 또한 "@ *"SELECT * FROM 어디에서 검색 할까? "%%% @ %% \" "'와 같은 페이지 텍스트를 검색 할 수 있습니다. –

답변

0

이스케이프 처리하지 않았기 때문에 앱이 충돌합니다. 이스케이프 문자 (이 경우 작은 따옴표). 이 라인을 추가 :

[sqlQuery stringByReplacingOccurrencesOfString:@"'" withString:@"\\'"];

작은 따옴표로 인한 충돌을 방지해야한다. 또한 모든 문자를 이스케이프 제거 할 정규식을 만들 수 있습니다.

+0

거기에 일반적인 방법은 이것을하기 때문에 때로는 큰 따옴표가 될 수 있으므로 – Jacky

+0

이 문자를 검색하고 적절하게 이스케이프 처리하는 정규 표현식을 만듭니다. http://stackoverflow.com/questions/4353834/search-through-nsstring-using-regular-expression을 참조하십시오. – James

관련 문제