Android AVIMConversationQuery 错误返回所有对话

Android SDK v3.13.4
Peer ID: 6
App ID: 8d3z4h58apk0l752sy3uqpzxufw3k3qgljur3q0ao9fxd1cz

AVIMConversationQuery 设置一个 whereXXX条件,就会返回所有的会话,其中包括 非自己参与的会话

下面的测试代码设置了条件 query.whereEqualTo("tr", null);

AVIMClient client = AVIMClient.getInstance("6");
AVIMConversationQuery query = client.getQuery();
query.setQueryPolicy(AVQuery.CachePolicy.NETWORK_ONLY);
query.whereEqualTo("tr", null);
query.setLimit(1000);
query.findInBackground(new AVIMConversationQueryCallback() {
    @Override
    public void done(List<AVIMConversation> list, AVIMException e) {
        for (AVIMConversation conversation : list) {
            String memebers = TextUtils.join(",", conversation.getMembers());
            Log.d("conversation", memebers);
        }
    }
});

输出结果:

query.whereEqualTo("lm", null);
query.whereEqualTo("tr", "aaa");

等,都会返回所有结果。

你好,我使用自己的 App ID 和你的 App ID 都无法复现你的问题。请问可否提供一个简单的 demo。

‘demo’是指做一个简单的App吗?

是的,新建个小项目,复现这个问题。我没有查出是哪里和你配置不一样。

上传时,记得删除 App ID 和 App Key。或者把项目私信发给我。

选择 “Import project”

感谢,我们排查一下 SDK,修复进展会在此处更新。

v3.13.5还没修复这么问题?

这个改动和其他问题有关系,正在修复中。

经测试,还是没有修复。

抱歉,我再跟进下,Server 端有点问题。

这个 issue 还有点棘手。先提供您解决方案,在 query 的时候加个判断条件:

query.containsMembers(Arrays.asList("6"));

然后我解释下,这么做的原因是:

目前 server 端,对 AVIMConversationQuery 查询请求的判断是,如果没有 whereXXX 等条件时,会默认取 clientId 也就是 6,返回与 6 相关的 conversation。

而一旦加上了 whereXXX 等条件,这个默认查询条件就会被覆盖,导致会去返回了,满足 whereXXX 条件的所有结果。

这里暂时不会改动,正在研究后续如何优化,以免造成误解。

明白了,谢谢!

query.containsMembers(Arrays.asList(mClient.getClientId()));
query.whereNotEqualsTo("lm", "");

加上了这两行,还是返回了很多空对话,请问还有哪里需要注意吗

你好,你的问题和这个主题内的问题并不是同一个问题,请使用 notExists 方法进行查询。

AVIMConversationQuery.whereDoesNotExist(String key)