0

I'm doing parse query to get data but new query parameter overrides old one.

In my app user can block other users. When its done I write a "Block" object to database like this

I block other user:

ParseObject block = new ParseObject("Block");                                
block.put("owner",ParseUser.getCurrentUser());                                                
block.put("who",otherUser);

when I get data I use this query.

    //I blocked him. dont sow me his data.
    ParseQuery<ParseObject> benblock= new ParseQuery<ParseObject>("Block");
    benblock.whereEqualTo("owner", ParseUser.getCurrentUser());

    //He blocked me dont show me his data.
    ParseQuery<ParseObject> oblock = new ParseQuery<ParseObject>("Block");                
    oblock.whereEqualTo("who",ParseUser.getCurrentUser());

    query.whereDoesNotMatchKeyInQuery("user","owner",oblock);  //This line doesn't work                
    query.whereDoesNotMatchKeyInQuery("user","who",benblock);  //But this line does.

But when i retrieve data first query option

query.whereDoesNotMatchKeyInQuery("user","owner",oblock); 

doesnt work only last one

 query.whereDoesNotMatchKeyInQuery("user","who",benblock);

works. How can I fix this.

kaya
  • 45
  • 6

2 Answers2

0

You can only add one whereDoesNotMatchKeyInQuery per key. When you add two of the same constraint for the same key, the second one is actually overriding the first. So I suggest you to use Parse.Query.and, like this:

//I blocked him. dont sow me his data.
ParseQuery<ParseObject> benblock = new ParseQuery<ParseObject>("Block");
benblock.whereEqualTo("owner", ParseUser.getCurrentUser());

//He blocked me dont show me his data.
ParseQuery<ParseObject> oblock = new ParseQuery<ParseObject>("Block");                
oblock.whereEqualTo("who", ParseUser.getCurrentUser());

ParseQuery<ParseObject> query1 = new ParseQuery<ParseObject>("YouDataClass");
query1.whereMatchesKeyInQuery("user","owner",oblock);  // you will need to create two queries
ParseQuery<ParseObject> query2 = new ParseQuery<ParseObject>("YouDataClass");
query2.whereMatchesKeyInQuery("user","who",benblock);

List<ParseQuery<ParseObject>> queries = new ArrayList<ParseQuery<ParseObject>>();
queries.add(query1);
queries.add(query2);
ParseQuery<ParseObject> orQuery = ParseQuery.or(queries);

ParseQuery<ParseObject> mainQuery = new ParseQuery<ParseObject>("YouDataClass");
mainQuery.whereDoesNotMatchQuery("objectId", orQuery);
Davi Macêdo
  • 2,954
  • 1
  • 8
  • 11
0

I solved my issue by doing this.

According to this(https://github.com/parse-community/Parse-SDK-Android/issues/211#issuecomment-150047052) Parse query override whereDoesNotMatchKeyInQuery only for the same key. Which meand I can use that parameter twice in a same query but not same key. And I just created same value with different key.

Previous my object was like this

    ParseObject object = new ParseObject("DataClass");
    object.put("post",post);
    object.put("user",user);

Now It looks like this:

    ParseObject object = new ParseObject("DataClass");
    object.put("post",post);
    object.put("user",user);
    object.put("user2",user);//same user with the above one

And I do query like this:

ParseQuery<ParseObject> benblock= new ParseQuery<ParseObject>("Block");
benblock.whereEqualTo("owner", ParseUser.getCurrentUser());

ParseQuery<ParseObject> oblock = new ParseQuery<ParseObject>("Block");
oblock.whereEqualTo("who",ParseUser.getCurrentUser());

hashtag.whereDoesNotMatchKeyInQuery("user","owner",oblock);
hashtag.whereDoesNotMatchKeyInQuery("user2","who",benblock);
kaya
  • 45
  • 6