Odd behavior of PFQuery - ios

I am trying to find all posts by the current user. When I add the line [query whereKey:#"user" equalTo:[PFUser user]]; the query does not even get executed, since "retrieving posts?" never prints to the console. When I comment out [query whereKey:#"user" equalTo:[PFUser user]]; it works just fine. What am I doing wrong?
PFQuery *query = [PFQuery queryWithClassName:#"Post"];
[query orderByDescending:#"createdAt"];
[query includeKey:#"filter"];
[query whereKey:#"user" equalTo:[PFUser user]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSLog(#"retrieving posts?");
...
}];

I don't know the obj-c but the correct implementation in Swift would be:
query.whereKey("user", equalTo: PFUser.currentUser())

Related

Unable to apply inner query on PFUser Class in Parse

We have a Table name userProfile which has a pointer userId to User Table.
We are applying inner query on userProfile
PFQuery *query = [PFQuery queryWithClassName:#"UserProfile"];
[query whereKey:#"userId" equalTo:[PFUser currentUser]];
[query whereKey:#"relation" equalTo:#"Agent"];
[query includeKey:#"userId"];
[query includeKey:#"profileId.userId"];
query.skip = arrProfiles.count;
query.limit = 15;
NSString *searchText = [NSString stringWithFormat:#"%#",self.searchBar.text];
**PFQuery *innerQuery =[PFUser query];
[innerQuery whereKey:#"username" matchesRegex:[NSString stringWithFormat:#"(?i)%#",searchText]];
[query whereKey:#"userId" matchesQuery:innerQuery];**
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
}];
but we are unable to get any results after applying inner query.
In the query, you are saying that the userId has to be equal to the current user. But in the inner query, you are saying that the userId has to match the user with a username entered in the search field.
This means that the query has to satisfy BOTH constraints in order to return results. This can only happen if the current user is literally searching for themselves.
If you are looking for BOTH the current user's profile AND the searched-for profile, you need to use an or query like so:
PFQuery *firstQuery = [PFQuery queryWithClassName:#"UserProfile"];
[query whereKey:#"userId" equalTo:[PFUser currentUser]];
NSString *searchText = [NSString stringWithFormat:#"%#",self.searchBar.text];
PFQuery *innerQuery =[PFUser query];
[innerQuery whereKey:#"username" matchesRegex:[NSString stringWithFormat:#"(?i)%#",searchText]];
PFQuery *secondQuery = [PFQuery queryWithClassName:#"UserProfile"];
[secondQuery whereKey:#"userId" matchesQuery:innerQuery];
PFQuery *query = [PFQuery orQueryWithSubqueries:[firstQuery, secondQuery]];
[query whereKey:#"relation" equalTo:#"Agent"];
[query includeKey:#"profileId.userId"];
query.skip = arrProfiles.count;
query.limit = 15;
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
}];

Parse Query - cannot process more than one whereKey:doesNotMatchKey:inQuery

I was trying this
PFQuery *allDealsQuery = [Deal query];
PFRelation *favoritedDealsRelation = [user objectForKey:#"favoritedDeals"];
PFQuery *favoritedDealsQuery = [favoritedDealsRelation query];
PFRelation *redeemedDealsRelation = [user objectForKey:#"redeemedDeals"];
PFQuery *redeemedDealsQuery = [redeemedDealsRelation query];
[allDealsQuery whereKey:#"objectId" doesNotMatchKey:#"objectId" inQuery:favoritedDealsQuery];
//Parse does not support more than 2 where queries???
[allDealsQuery whereKey:#"objectId" doesNotMatchKey:#"objectId" inQuery:redeemedDealsQuery];
[allDealsQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error) {
onSuccess(objects);
}
else {
onError(error);
}
}];
When I tried to use two queries, the answer was different from what was expected.
So should I use be using only one doesNotMatchKey query?
Try referencing parse documentation on Compound Queries:
https://parse.com/docs/ios_guide#queries-compound/iOS
Compound Queries
If you want to find objects that match one of several queries, you can use orQueryWithSubqueries: method. For instance, if you want to find players with either have a lot of wins or a few wins, you can do:
PFQuery *lotsOfWins = [PFQuery queryWithClassName:#"Player"];
[lotsOfWins whereKey:#"wins" greaterThan:#150];
PFQuery *fewWins = [PFQuery queryWithClassName:#"Player"];
[fewWins whereKey:#"wins" lessThan:#5];
PFQuery *query = [PFQuery orQueryWithSubqueries:#[fewWins,lotsOfWins]];
[query findObjectsInBackgroundWithBlock:^(NSArray *results, NSError *error) {
// results contains players with lots of wins or only a few wins.
}];

IOS Parse include key query

I am trying to print the name of a category using Parse in iOS and Objectve-C. Thanks for looking. Let me know if you have any questions.
CategoryInBudget Table
category(pointer)
amount(number)
user(pointer)
Category Table
name(string)
Here is my code:
PFQuery *query = [PFQuery queryWithClassName:#"CategoryInBudget"];
[query whereKey:#"user" equalTo:[PFUser currentUser]];
[query includeKey:#"Category"];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
for (PFObject *object in objects) {
NSLog(#"%#", object[#"Category"][#"name"];
}
}];

Parse, query to find games of one user

In parse i have a "Game" class with array pointer column called "Players". I want to get games that contain [PFUser currentUser] in arrayKey called "Players", always this column stored a three players array.
I tried some query, i couldn't get success.
PFQuery *query = [PFQuery queryWithClassName:#"Game"];
[query whereKey:#"Players" containsAllObjectsInArray:#[[PFUser currentUser]]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{...}];
Also tried.
[query whereKey:#"Players" containsAllObjectsInArray:#[[PFUser currentUser].objectId]];
I'm sure already stored a Game with current User inside.
Thanks in advanced.
Just do this:
PFQuery *query = [PFQuery queryWithClassName:#"Game"];
[query whereKey:#"Players" equalTo:[PFUser currentUser]];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error)
{...}];
If you run equalTo on an array key, it checks to see if the value is in the array.
Make sure to check that you stored a pointer to the user, and not their objectId. If you're storing id's instead, do equalTo:[PFUser currentUser].objectId];

how to query based on pfobject/pfuser associated with another pfobject in parse.com?

I have a Parse class called FriendRelation. This class has two users, one a friend the other a user.
I want to get all of the messages posted by all of the friends of a user. I am attempting to do so with the following query:
PFQuery *innerQuery = [PFQuery queryWithClassName:#"FriendRelation"];
[innerQuery whereKey:#"user" equalTo:currentUser];
PFQuery *query = [PFQuery queryWithClassName:#"Message"];
[query whereKey:#"userMessage" matchesQuery:innerQuery];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
}];
This query comes back with no results.
I believe this is occurring because of the line:
[query whereKey:#"userMessage" matchesQuery:innerQuery];
The where key needs to be a FriendRelation to match. Is this correct?
How can I make the results of the inner query be a user that will intern match the matching query?
Thanks!
You can try using
- (void)whereKey:(NSString *)key matchesKey:(NSString *)otherKey inQuery:(PFQuery *)query
Something like:
PFQuery *innerQuery = [PFQuery queryWithClassName:#"FriendRelation"];
[innerQuery whereKey:#"user" equalTo:currentUser];
PFQuery *query = [PFQuery queryWithClassName:#"Message"];
[query whereKey:#"userMessage" matchesKey:#"firendUser" inQuery:innerQuery];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError *error) {
//do something useful..
}];
Let me know how it goes!

Resources