sqlite selectObject方法,%%% @ %% stuff

时间:2015-11-19 17:50:31

标签: ios objective-c sqlite uisearchbar

所以我正在为我的应用编写搜索功能,代码如下:

- (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 个答案:

答案 0 :(得分: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_finalize引用的sqlite3_stmt。没有它,代码就会泄漏。

  3. 您正在使用initWithFormat来构建SQL。这是一个非常糟糕的主意,因为如果用户曾经搜索过类似O'Malley的内容,那么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);
    }