开发者社区 问答 正文

从Firebase数据库无法获得任何结果

我刚刚开始学习Android Studio,并且正在尝试进行一项搜索活动,该活动可以从我的Firebase数据库中搜索数据。但是,每当我尝试搜索时,屏幕上都不会显示任何结果,并且不会从数据库中检索任何数据。谁能解决这个问题?谢谢。

        Log.d(TAG, "searchForMatch: searching for a match: " + keyword);
        imageDTOs.clear();
        if(keyword.length() == 0) {

        } else {
            DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
            Query query = reference.child("books").orderByChild("title").equalTo(keyword);

            query.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
                        Log.d(TAG, "onDataChange: found book:" + singleSnapshot.getValue(ImageDTO.class).toString());

                        imageDTOs.add(singleSnapshot.getValue(ImageDTO.class));

                        }

                        searchAdapter = new SearchAdapter(SearchActivity.this, R.layout.item_library, imageDTOs);
                        listView.setAdapter(searchAdapter);
                    }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }

    } 

展开
收起
Puppet 2019-12-03 16:16:43 428 分享 版权
阿里云 AI 助理回答

从你提供的代码片段来看,你的搜索逻辑似乎是正确的。但是有几个潜在的问题和建议,你可以检查和尝试以解决当前遇到的无结果显示问题:

  1. 确保Firebase数据库连接正确:请确认FirebaseDatabase.getInstance().getReference()能够成功获取到你的数据库引用,并且"books"节点确实存在且含有数据。

  2. 检查关键词匹配逻辑:你正在使用equalTo(keyword)来精确匹配书名。这意味着只有当书名完全与输入的关键词相同时才会返回结果。如果你希望实现模糊搜索(比如用户输入的部分关键词出现在书名中也能匹配),你需要改变查询逻辑,可能需要在后端添加支持全文搜索的功能,或者在客户端收集所有数据后进行过滤。

  3. 数据同步问题:确保你的Firebase数据库规则允许读取操作。可以在Firebase控制台的“数据库”>“规则”部分检查这一点。

  4. ImageDTO类定义:请确认ImageDTO.class已经正确映射了Firebase数据库中的数据结构。如果类的字段名称或类型与数据库不匹配,getValue(ImageDTO.class)可能会失败。

  5. 调试日志:利用日志输出来诊断问题。在onDataChange方法内,增加一些日志输出来确认是否进入了循环体,以及dataSnapshot.getChildren()是否有数据。例如:

    Log.d(TAG, "onDataChange: dataSnapshot has " + dataSnapshot.getChildrenCount() + " children.");
    
  6. Adapter更新时机:确保在数据变化时适当地通知Adapter。你目前的代码在for循环内部设置了Adapter,这可能导致多次不必要的Adapter设置。应该在数据加载完成后一次性设置Adapter,并在数据变化时调用searchAdapter.notifyDataSetChanged()

  7. 空查询处理:当keyword.length() == 0时,你的代码没有明确的操作。虽然这不是直接导致问题的原因,但根据需求,你可能想要在这里做一些处理,比如清空列表或显示提示信息。

  8. 错误处理:检查onCancelled方法是否被调用,这可以提供关于为什么查询失败的信息。

通过上述步骤排查,你应该能定位并解决问题。如果问题依旧,请提供更多详细信息,如错误日志或其他相关代码片段,以便进一步分析。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: