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
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分把我吵醒了哈哈。我明天会测试它,这是我得到的最长最好的答案,谢谢!!祝您今天过得愉快!