所以我正在为我的应用编写搜索功能,代码如下:
- (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说: 当我输入字符串" note1",并且昨晚它根本不识别我的字符串,并且记录了各种乱码的东西,比如$#$ *#%#**(你知道。 ) 我希望有人可以快速帮助我...
答案 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并再试一次。
但是,如果您解决了这个%%%@%%
问题,并且您仍然没有看到您的表格被刷新,那么该问题可能有多种可能来源:
tableOfNotes
是nil
(例如,插座没有正确连接); axKnotes
和/或notesName
为nil
(例如NSMutableArray
从未正确实例化);或UITableView
的数据源未正确连接。如果修复了SQLite代码但仍未看到表视图更新,则应检查这些变量/属性(使用断点或NSLog
)并确保它们都不是nil
-
关于此SQLite代码的一些不相关的警告:
如果sqlite3_errmsg
失败,我建议记录sqlite3_prepare_v2
,如果没有,则错误将无法通过。
请务必致电sqlite3_finalize
引用的sqlite3_stmt
。没有它,代码就会泄漏。
您正在使用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);
}