2015-11-19 28 views
1

所以我在寫我的應用程序的搜索功能和代碼是這樣的:sqlite的選擇對象的方法,%%% @ %%的東西

- (void) selectObject: (NSString *)notes{ 
    [axKnotes removeAllObjects]; 
    [notesName removeAllObjects]; 
    NSString *sql = [[NSString alloc] initWithFormat:@"SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%%%@%%'", notes]; 
    //there's a problem NSLog(sql); 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(dataBase, [sql UTF8String], -1, &statement, nil) == SQLITE_OK){ 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      char *ch0=(char *)sqlite3_column_text(statement, 0); 
      NSString *name = [[NSString alloc]initWithUTF8String:ch0]; 
      [notesName addObject:name]; 
      //content 
      char *ch1= (char*)sqlite3_column_text(statement, 1); 
      NSString *content = [[NSString alloc]initWithUTF8String:ch1]; 
      [axKnotes addObject:content]; 
     } 
    } 
} 

- (void) searchBar: (UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    [self selectObject:searchText]; 
    [self.tableOfNotes reloadData]; 
} 

的%%% @ %%完全在另一個應用程序,但在我鍵入(文本更改)時,數組會立即清除,並且不會再次更改。和NSLog說: enter image description here 當我鍵入字符串「note1」,昨晚它根本不認識我的字符串,並且阻止了所有類似亂碼的東西,如$#* *#%#**(你知道。) 我希望有人可以幫助我真正快速...

回答

1

您使用%%%@%%是正確的(有一個警告,我會稍後談)。當我跑到你的代碼,我看到:

2015-11-19 10:23:57.981 MyApp[78060:30221665] SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%N%' 
2015-11-19 10:23:58.867 MyApp[78060:30221665] SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%No%' 
2015-11-19 10:23:59.576 MyApp[78060:30221665] SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%Not%' 
2015-11-19 10:24:00.160 MyApp[78060:30221665] SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%Note%' 
2015-11-19 10:24:00.970 MyApp[78060:30221665] SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%Notes%' 
2015-11-19 10:24:04.885 MyApp[78060:30221665] SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE '%Notes1%' 

如果你真的使用這個代碼,並沒有看到%人物展現出來,我們有了一些基本的脫節。我建議在那裏設置一個斷點,並確保這個方法被調用,而不是其他可能纏繞的其他排列方式。此外,請確保您的代碼不使用某些非ASCII %字符。

如果問題仍然存在,您可能需要從設備/模擬器中刪除應用程序,然後重試。如果不這樣做,那麼找到派生的數據文件夾,退出Xcode,清空派生數據文件夾,然後重新啓動Xcode並重試。

但是,如果解決這個問題%%%@%%,你還是看不到你的表得到更新,也有這個問題的可能來源的多樣化:

  • tableOfNotesnil(如出口沒有正確連接);
  • axKnotes和/或notesNamenil(例如,NSMutableArray從未正確實例化);或
  • UITableView的數據源未正確連接。

如果您在SQLite的代碼固定的,仍然沒有看到表視圖更新,您應該檢查這些變量/屬性(或者使用斷點或NSLog),確保沒有的他們是nil

-

這個SQLite的代碼的一些不相關的注意事項:

  1. 我建議你登錄sqlite3_errmsg如果sqlite3_prepare_v2失敗,不這樣做,錯誤會通過未觀察到的。

  2. 記得調用sqlite3_stmt參考sqlite3_finalize。沒有這個,代碼將會泄漏。

  3. 您正在使用initWithFormat來構建SQL。這是一個非常糟糕的主意,因爲如果用戶曾經搜索過像O'Malley這樣的SQL,那麼SQL將會失敗。相反,使用在SQL中的佔位符?從SQL刪除'字符,然後將值綁定到?佔位符:

    - (void) selectObject: (NSString *)notes{ 
        [axKnotes removeAllObjects]; 
        [notesName removeAllObjects]; 
    
        const char *sql = "SELECT NOTESNAME, NOTESCONTENT, STATUS FROM axKnotes WHERE NOTESCONTENT LIKE ?"; 
        NSString *value = [[NSString alloc] initWithFormat:@"%%%@%%", notes]; 
    
        sqlite3_stmt *statement; 
    
        if (sqlite3_prepare_v2(dataBase, sql, -1, &statement, NULL) != SQLITE_OK) { 
         NSLog(@"%s", sqlite3_errmsg(dataBase)); 
         return; 
        } 
    
        if (sqlite3_bind_text(statement, 1, [value UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) { 
         NSLog(@"%s", sqlite3_errmsg(dataBase)); 
        } 
    
        int rc; 
        while ((rc = sqlite3_step(statement)) == SQLITE_ROW) { 
         char *ch0=(char *)sqlite3_column_text(statement, 0); 
         NSString *name = ch0 ? [[NSString alloc]initWithUTF8String:ch0] : @""; 
         [notesName addObject:name]; 
         //content 
         char *ch1= (char*)sqlite3_column_text(statement, 1); 
         NSString *content = ch1 ? [[NSString alloc]initWithUTF8String:ch1] : @""; 
         [axKnotes addObject:content]; 
        } 
        if (rc != SQLITE_DONE) { 
         NSLog(@"%s", sqlite3_errmsg(dataBase)); 
        } 
    
        sqlite3_finalize(statement); 
    } 
    
+0

哦。哇!非常感謝!你的回答在上午2點47分在中國大聲吵醒了我。我明天會測試它,這是我得到的最長,最好的答案,謝謝!祝你有美好的一天! – Allen

+1

哦對不起。我只知道如何接受這一點。 – Allen

相關問題