Un progetto che ho ereditato attualmente utilizza Parse per il backend. Sto provando a migrare il modo in cui i dati vengono recuperati/postati, dall'SDK iOS di Parse all'utilizzo dell'API REST Parse (utilizzando AFNetworking
).Query composta per Parse.com utilizzando l'API REST
sono stato in grado di convertire un semplice PFQuery
come la seguente al suo REST equivalente:
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...
}
}];
API REST Richiesta:
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];
Il problema però è con composti que Ries come quello qui sotto:
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"];
Se qualcuno potesse aiutarmi a capire come costruire la parameters
per questo, mi piacerebbe davvero apprezzare. Sarà d'aiuto anche un'idea generale su come procedere nella giusta direzione. Ho rinviato allo Parse REST API Guide, ma non riesco a ottenerlo. Sto cercando di farlo bene usando $inQuery
, ma ancora senza fortuna.
Una risposta a questa domanda coprirà la maggior parte dei problemi comuni e complessi che si presentano quando si esegue una query con l'API REST Parse (su iOS).
provare a eseguire l'applicazione con monitoraggio Carlo per vedere esattamente quello che manda – Wain
È possibile ottenere tutti i record con query normale REST API e si può applicare vincoli da predicati. Questo può aiutarti a ottenere la soluzione. –
@ AjayGabani, va bene, ma se volessi farlo, lo avrei fatto prima. Devo ottimizzare anche l'utilizzo dei dati. Cosa succede se ci sono un milione di record nel database, ma solo 20 che soddisfano la mia query composta? Non sarà una buona pratica. – n00bProgrammer