解析查询覆盖旧查询的新查询?

Posted

技术标签:

【中文标题】解析查询覆盖旧查询的新查询?【英文标题】:Parse Query overrides new query over old one? 【发布时间】:2019-05-12 11:01:04 【问题描述】:

我正在解析查询以获取数据,但新的查询参数覆盖了旧的。

在我的应用中,用户可以阻止其他用户。完成后,我像这样将“块”对象写入数据库

我屏蔽了其他用户:

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);

有效。我该如何解决这个问题。

【问题讨论】:

【参考方案1】:

每个键只能添加一个 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);

【讨论】:

android 没有“和”。只有“或” 对不起。我没注意到。我刚刚更新了代码。你能试试这个新版本吗? 不起作用。查询仍然检索被阻止的人员数据。似乎我也无法使用 include 方法设置限制或获取关系数据。 嘿,戴维。我解决了我的问题,看看我的答案。感谢您的时间和努力【参考方案2】:

我通过这样做解决了我的问题。

据此(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);

【讨论】:

以上是关于解析查询覆盖旧查询的新查询?的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins - 选择参数 - mysql 数据库查询返回列表

MySQL 和大量查询

查询后如何更新 Apollo 缓存?

MySQL查询高速缓冲详解

数据库面试题查询题目解析-助力高薪

面试数据库查询题解析 - 育华助你高薪一臂之力