我正在尝试实现用户的搜索功能,我正在尝试使用NSPredicate,但它无效。
我正在尝试使用LIKE查询。
以下是我正在使用的代码
NSPredicate *userPredicate = [NSPredicate predicateWithFormat:@"(%@ CONTAINS[cd] %@) OR (%@ CONTAINS[cd] %@) AND %@ != %@",KEY_FirstName, sender.text,KEY_Lastname, sender.text,KEY_Id,[PFUser currentUser].objectId];
queryForUserSearch = [PFUser queryWithPredicate:userPredicate];
// I also tried this
NSPredicate *userPredicate = [NSPredicate predicateWithFormat:@"(%@ = %@) OR (%@ = %@) AND %@ != %@",KEY_FirstName, sender.text,KEY_Lastname, sender.text,KEY_Id,[PFUser currentUser].objectId];
queryForUserSearch = [PFUser queryWithPredicate:userPredicate];
我收到了错误
原因:[PFQuery queryWithClassName:predicate:]不支持正则表达式查询。请尝试构建数据,以便您可以使用equalTo或containsIn查询。'
我也在搜索这个但不适合我。
答案 0 :(得分:1)
首先,你的对象,这是你设置它的方式,例如:
Book.h
#import <Foundation/Foundation.h>
@interface Book : NSObject
@property (strong, nonatomic)NSString *bookID;
@property (strong, nonatomic)NSString *publishingYear;
@property (strong, nonatomic)NSString *author;
@property (strong, nonatomic)NSString *printHouse;
@property (strong, nonatomic)NSString *title;
@property (strong, nonatomic)NSString *ISBN;
-(id)initWithBookObjectId:(NSString *)bookID
publishingYear:(NSString *)publishingYear
author:(NSString *)author
printHouse:(NSString *)printHouse
title:(NSString *)title
ISBN:(NSString *)ISBN;
- (id)initWithDictionary:(PFObject *)dic;
@end
Book.m
#import "Book.h"
#define NSHNullCheck(object) ([object isKindOfClass:[NSNull class]] ? nil : object)
@implementation Book
{
NSDictionary * descriptionDict;
}
-(id)initWithBookObjectId:(NSString *)bookID
publishingYear:(NSString *)publishingYear
author:(NSString *)author
printHouse:(NSString *)printHouse
title:(NSString *)title
ISBN:(NSString *)ISBN;
{
self = [super init];
if (self) {
_bookID = bookID;
_publishingYear = publishingYear;
_author = author;
_printHouse = printHouse;
_title = title;
_ISBN = ISBN;}
return self;
}
- (id)initWithDictionary:(PFObject *)dic
{
self = [self initWithBookObjectId:dic.objectId
publishingYear:NSHNullCheck([dic valueForKey:@"publishingYear"])
author:NSHNullCheck([dic valueForKey:@"author"])
printHouse:NSHNullCheck([dic valueForKey:@"printHouse"])
title:NSHNullCheck([dic valueForKey:@"title"])
ISBN:NSHNullCheck([dic valueForKey:@"ISBN"])];
descriptionDict = @{ @"sessionObjectId":_bookID,
@"teacherAge":_publishingYear,
@"teacherEmail":_author,
@"teacherFacebookuniquekey":_printHouse,
@"teacherFirstname":_title,
@"teacherGender":_ISBN};
return self;
}
- (id)init
{
self = [self initWithBookObjectId:nil
publishingYear:nil
author:nil
printHouse:nil
title:nil
ISBN:nil];
return self;
}
- (NSString *)description
{
return descriptionDict.description;
}
@end
在对象模型中存储数据: 书籍是一个数组,用于保存您的书籍对象&#34; 无论您使用Parse中的查询从网络中提取数据,都会出现以下代码片段。
for (PFObject *object in objects) { //"objects" here is the NSArrray returned from the parse query!
Book *book = [[Book alloc] initWithBookObjectId:object.objectId];
book.publishingYear = object[@"publishingYear"];
book.author = object[@"author"];
book.printHouse = object[@"printHouse"];
book.title = object[@"title"];
book.ISBN = object[@"isbn"];
[self.books addObject:book];
}
if ([self.searchTerm isEqualToString:@""]) {
self.filteredBooksArray = self.books;
} else {
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.title contains[c] %@",self.searchTerm];
self.filteredBooksArray = [NSMutableArray arrayWithArray:[self.books filteredArrayUsingPredicate:predicate]];
}
[self.booksTable reloadData];
因此,这就是你用PFObjects进行搜索的方式,首先需要提取数据,将这些数据保存在NSObject子类(数据对象模型)中,然后像在任何带有搜索的对象模型上一样使用正则表达式谓词在IOS中的功能。
有这种方法:
PFQuery *query = [PFQuery queryWithClassName:@"Post"]
[query whereKey:@"hashtags" containsAllObjectsInArray:@[@"#parse", @"#ftw"]];
NSArray *parseFTWPosts = [query findObjects];
然后这个方法:
/ Using PFQuery
[query whereKey:@"playerName" notEqualTo:@"Michael Yabuti"];
[query whereKey:@"playerAge" greaterThan:@18];
// Using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"playerName != 'Michael Yabuti' AND playerAge > 18"];
PFQuery *query = [PFQuery queryWithClassName:@"GameScore" predicate:predicate];
然后是这个片段:
Specifying Constraints with NSPredicate
To get the most out of PFQuery we recommend using its methods listed below to add constraints. However, if you prefer using NSPredicate, a subset of the constraints can be specified by providing an NSPredicate when creating your PFQuery.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"playerName = 'Dan Stemkosk'"];
PFQuery *query = [PFQuery queryWithClassName:@"GameScore" predicate:predicate];
let predicate = NSPredicate(format: "playerName = 'Dan Stemkosk'")
var query = PFQuery(className: "GameScore", predicate: predicate)
These features are supported:
Simple comparisons such as =, !=, <, >, <=, >=, and BETWEEN with a key and a constant.
Containment predicates, such as x IN {1, 2, 3}.
Key-existence predicates, such as x IN SELF.
BEGINSWITH expressions.
Compound predicates with AND, OR, and NOT.
Sub-queries with "key IN %@", subquery.
The following types of predicates are not supported:
Aggregate operations, such as ANY, SOME, ALL, or NONE.
Regular expressions, such as LIKE, MATCHES, CONTAINS, or ENDSWITH.
Predicates comparing one key to another.
Complex predicates with many ORed clauses.
以及更多:
https://github.com/ParsePlatform/Docs/blob/master/en/ios/queries.mdown