ios - 解析 PFUser QueryWithPredicate 不工作

标签 ios objective-c parse-platform pfquery pfuser

我正在尝试实现用户的搜索功能,为此我正在尝试使用 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 或 containedIn 查询。'

我也在搜索这个,但对我没有用。

最佳答案

首先,您的对象,这是您设置它的方式,例如:

书.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

书.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

在对象模型中存储数据: books 是一个数组,其中包含您的“书籍对象” 无论您使用 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

关于ios - 解析 PFUser QueryWithPredicate 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32283120/

相关文章:

iphone - 如果我不创建自动释放对象,是否需要自动释放池?

iphone - 对齐 UITableView 的页脚中的文本

java - onNewIntent 没有被调用

ios - 解析 Swift : Check if update was successfully committed

ios - 当我收到 Parse 的推送通知时,如何播放声音?

ios - UITableView 在禁用滚动的情况下动态增加高度?

ios - 初始化核心数据 ManagedObjectContext

IOS Google Analytics - 没有数据通过

ios - 创建带有文本和十字符号的动态标签

ios - 地幔解析数组