gpt4 book ai didi

ios - 使用 REST API 对 Parse.com 进行复合查询

转载 作者:可可西里 更新时间:2023-11-01 03:18:35 27 4
gpt4 key购买 nike

我继承的一个项目目前使用 Parse 作为后端。我正在尝试将获取/发布数据的方式从 Parse iOS SDK 迁移到使用 Parse REST API(使用 AFNetworking)。

我能够转换一个简单的 PFQuery像下面的 REST 等价物:

PFQuery

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.'999Z'"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

NSString *createdAt = [dateFormatter stringFromDate:createdAtDate];

PFQuery *query = [PFQuery queryWithClassName:@"Photo"];
[query whereKey:@"createdAt" lessThan:createdAt];
[query orderByDescending:@"createdAt"];
[query setLimit:10];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
//Etc...
}
}];

REST API 请求 :
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.'999Z'"];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

NSString *createdAt = [dateFormatter stringFromDate:createdAtDate];

NSString *dateQueryString = [NSString stringWithFormat:@"{\"createdAt\":{\"$lte\":{\"__type\":\"Date\",\"iso\":\"%@\"}}}", createdAt];

NSDictionary* parameters = @{@"order": @"-createdAt",
@"limit": @10,
@"include": @"user",
@"where":dateQueryString};

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer parseSerializer]; // Already has App-Id, App-key and Content-Type set.

NSMutableURLRequest* request = [manager.requestSerializer requestWithMethod:@"GET" URLString:@"https://api.parse.com/1/classes/Photo" parameters:parameters error:nil];

AFHTTPRequestOperation* operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {

// Etc..

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"%@", error.localizedDescription);
}];

[operation start];

然而,问题在于复合查询,如下所示:
NSMutableArray* subqueriesArray = [NSMutableArray array];

PFQuery *followingActivitiesQuery = [PFQuery queryWithClassName:@"Activity"];
[followingActivitiesQuery whereKey:@“type” equalTo:@“Follow”];
[followingActivitiesQuery whereKey:@“fromUser” equalTo:[PFUser currentUser]];
followingActivitiesQuery.limit = 1000;

PFQuery *privateUserQuery = [PFUser query];
[privateUserQuery whereKey:@“yourMomLikedThisPhoto” equalTo:[NSNumber numberWithBool:NO]]; // fake whereKey of course

PFQuery *photosFromFollowedUsersQuery = [PFQuery queryWithClassName:@"Photo"];
[photosFromFollowedUsersQuery whereKey:@“yourMomLikedThisPhoto” equalTo:[NSNumber numberWithBool:YES]];
[photosFromFollowedUsersQuery whereKey:@“user” matchesKey:@“toUser” inQuery:followingActivitiesQuery];
[photosFromFollowedUsersQuery whereKey:@“user” matchesQuery:privateUserQuery];

PFQuery *photosFromCurrentUserQuery = [PFQuery queryWithClassName:@"Photo"];
[photosFromCurrentUserQuery whereKey:@“yourMomLikedThisPhoto” equalTo:[NSNumber numberWithBool:YES]];
[photosFromCurrentUserQuery whereKey:@“user” equalTo:[PFUser currentUser]];

[subqueriesArray addObject:photosFromFollowedUsersQuery];
[subqueriesArray addObject:photosFromCurrentUserQuery];

PFQuery *query = [PFQuery orQueryWithSubqueries:subqueriesArray];
[query includeKey:@"Photo"];
[query orderByDescending:@"createdAt"];

如果有人可以帮助我了解如何构建 parameters为此,我真的很感激。关于如何朝着正确方向前进的总体思路也会有所帮助。我已经提到了 Parse REST API Guide ,但我似乎无法理解。我正在尝试使用 $inQuery 使其正确,但还没有运气。

这个问题的答案将涵盖使用 Parse REST API(在 iOS 上)查询时面临的大多数常见和复杂问题。

最佳答案

$ 或 的转换使用

我认为您要做的是使用您选择的库 (AFNetworking) 将以下调用转换为相关的 http 调用。正如您所看到的,子查询行为嵌入在一个特定的编码 url 中,该 url 包含一个带有字典的数组,其值是带有比较语句的字典。

curl -X GET \
-H "X-Parse-Application-Id: ${APPLICATION_ID}" \
-H "X-Parse-REST-API-Key: ${REST_API_KEY}" \
-G \
--data-urlencode 'where={"$or":[{"wins":{"$gt":150}},{"wins":{"$lt":5}}]}' \
https://api.parse.com/1/classes/Player

( source )

另一种方法是使用子类查询。

子类查询

您可以使用类方法查询来查询特定子类的对象。以下示例查询用户可以负担得起的盔甲:
PFQuery *query = [Armor query];
[query whereKey:@"rupees" lessThanOrEqualTo:[PFUser currentUser][@"rupees"]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
Armor *firstArmor = [objects firstObject];
// ...
}
}];

( source )

关系查询

有多种方法可以对关系数据发出查询。如果要检索字段与特定 PFObject 匹配的对象,可以使用 whereKey:equalTo: 就像其他数据类型一样。例如,如果每个 Comment 在其 post 字段中都有一个 Post 对象,您可以获取特定 Post 的评论:
// Assume PFObject *myPost was previously created.
// Using PFQuery
PFQuery *query = [PFQuery queryWithClassName:@"Comment"];
[query whereKey:@"post" equalTo:myPost];

[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
// comments now contains the comments for myPost
}];

// Using NSPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"post = %@", myPost];
PFQuery *query = [PFQuery queryWithClassName:@"Comment" predicate:predicate];

[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
// comments now contains the comments for myPost
}];

一个解析博客 Post还提到可以使用以下方法进一步增强谓词:

At this time, we support these NSPredicate features:

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. See our docs for more details and examples.



分解参数的具体技巧

我建议评估显示如何解释 REST API 值的任何示例。请记住,大多数传输可能会表示类似 JSON 的格式。在这些情况下,'[' 方括号是数组,'{' 大括号代表字典,您需要在将参数化数据推送到 http 请求之前对其进行编码。

应用信息

根据上面讨论的内容,您可以创建一个 REST API 调用。您必须对特定于您的用例的各种标准的 where 子句进行编码。可以使用以下方法来确保这些参数符合您需要的查询属性:
var encodedParam = param.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

假设上面的参数是一些字符串,您的键值类似于:
'where={"$or":[{"wins":{"$gt":150}},{"wins":{"$lt":5}}]}'

编码参数将在您的应用程序 ID 和 REST API key 之后添加到基本 REST-API 查询字符串中 - 这应该返回您想要的对象:
api-query (注意用于查询的第四个网址)。

看起来编码参数应该在上面引用的类名之后,如下例所示:

encoded-params (使用上面的格式推断您的值,还要注意查询字符串“...classname ?%s encodingParams”中的额外字符)。

您可能想要使用的其他查询运算符包括:

query-operators

其他查询示例

another-example

人们可以通过使用提供的 examples 来推断如何构造更复杂的查询。在 Parse 网站上。将这些查询打包成编码参数应该会产生您想要的结果。我要做的是首先使用常规 Parse API 构造一个查询,然后将其转换为上面标识的 REST-API 构造。

例如:
let urlpath = NSString(format: "https://api.parse.com/1/classes/Photo?%s\(encodedParams)")

... add code to call the urlPath

对您的主要问题的具体答复

重新阅读问题后,我想回答您需要将多个子查询添加到 REST-API 参数列表的具体问题。我认为仔细检查 $or 子句会很有用。只要您可以将 Photo 对象上的相关键应用于多个标准,那么您应该能够实现您的目标。
'where={"$or":[{"wins":{"$gt":150}},{"wins":{"$lt":5}}]}'

复合查询示例

$or 子句是 Parse 网站上复合查询下使用的示例。上面的代码可以转置到您的用例中,并使用前面指定的编码 url 方法进行应用。

compound-query

Nota Bene

请注意,下面的示例显示了检索多个相关对象(使用 $inQuery)。可以检索多少内部对象是有限制的。我注意到这基本上与您在代码中所做的事情等效,因此希望使用此示例进行推断会相对简单。

multiple-objects

注意

请注意 Parse 关于何时使用 REST-API 的警告。

rest-api-caution

关于ios - 使用 REST API 对 Parse.com 进行复合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30215407/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com