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

Ios sqlite selectObject方法,%%%@%%stuff,ios,objective-c,sqlite,uisearchbar,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

因此,我正在为我的应用程序编写一个搜索功能,代码如下:

- (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];
}
%%@%%在另一个应用程序中工作得很好,但在这里,当我键入(文本更改)时,数组将立即清除,不再更改。国家统计局日志上说: 当我输入字符串“note1”时,昨晚它根本不识别我的字符串,并且记录了各种乱码,比如$$$*%.**(你知道的)
我希望有人能很快帮我解决问题……

您使用的
%%%@%%
是正确的(稍后我将讨论一个警告)。当我运行您的代码时,我看到:

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并重试

但是,如果您解决了此
%%%%@%%
问题,但仍然没有看到表被刷新,则该问题可能有多种来源:

  • tablofnotes
    nil
    (例如,插座未正确连接)
  • axKnotes
    和/或
    notesName
    nil
    (例如
    NSMutableArray
    从未正确实例化);或
  • UITableView
    的数据源未正确连接
如果您的SQLite代码已修复,但仍然没有看到表视图更新,则应检查这些变量/属性(使用断点或
NSLog
),并确保它们都不是
nil

--

关于此SQLite代码,有几个不相关的注意事项:

  • 我建议记录
    sqlite3\u errmsg
    如果
    sqlite3\u prepare\u v2
    失败,否则错误将无法观察到

  • 记住调用
    sqlite3\u stmt
    引用的
    sqlite3\u finalize
    。否则,代码将泄漏

  • 您正在使用
    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);
    }
    

  • 哦哇!非常感谢!你的回答在中国凌晨2点47分把我吵醒了哈哈。我明天会测试它,这是我得到的最长最好的答案,谢谢!!祝您今天过得愉快!