Parse Query переопределяет новый запрос поверх старого?

Я делаю запрос на синтаксический анализ, чтобы получить данные, но новый параметр запроса переопределяет старый.

В моем приложении пользователь может блокировать других пользователей. Когда это будет сделано, я пишу объект «Блок» в базу данных, как это

Я блокирую другого пользователя:

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

когда я получаю данные, я использую этот запрос.

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

Но когда я получаю первый вариант запроса данных

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

не работает только последний

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

работает. Как я могу это исправить.


person kaya    schedule 12.05.2019    source источник


Ответы (2)


Вы можете добавить только один whereDoesNotMatchKeyInQuery для каждого ключа. Когда вы добавляете два одинаковых ограничения для одного и того же ключа, второе фактически переопределяет первое. Поэтому я предлагаю вам использовать Parse.Query.and, например:

//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);
person Davi Macêdo    schedule 13.05.2019
comment
андроид не имеет и. Только или - person kaya; 13.05.2019
comment
Извиняюсь. Я не заметил. Я только что обновил код. Не могли бы вы попробовать эту новую версию? - person Davi Macêdo; 14.05.2019
comment
Не работает. Запрос по-прежнему извлекает данные заблокированных лиц. Также кажется, что я не могу установить ограничение или получить реляционные данные с помощью метода include. - person kaya; 14.05.2019
comment
Эй, Дави. Я решил свою проблему, проверьте мой ответ. Спасибо за ваше время и усилия - person kaya; 14.05.2019

Я решил свою проблему, сделав это.

В соответствии с этим(https://github.com/parse-community/Parse-SDK-Android/issues/211#issuecomment-150047052) Переопределение запроса синтаксического анализа whereDoesNotMatchKeyInQuery только для одного и того же ключа. Это означало, что я могу использовать этот параметр дважды в одном запросе, но не с одним и тем же ключом. И я только что создал одно и то же значение с другим ключом.

Предыдущий мой объект был таким

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

Теперь это выглядит так:

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

И я делаю запрос следующим образом:

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);
person kaya    schedule 14.05.2019