【问题标题】:How to search data in Firebase?如何在 Firebase 中搜索数据?
【发布时间】:2017-01-31 07:25:50
【问题描述】:
Bundle bundle = getIntent().getExtras();
   String name = bundle.getString("name");

   mValueView = (TextView) findViewById(R.id.textView);

   mRef = FirebaseDatabase.getInstance()
            .getReferenceFromUrl("https://mymap-3fd93.firebaseio.com/Users");

   com.google.firebase.database.Query query = mRef.child("Users").orderByChild("title").equalTo(name);

   query.addValueEventListener(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapshot) {
           //Map<String,Object> map = (Map<String, Object>) dataSnapshot.getValue();
           //String Title = (String) map.get("title");
           String Title = dataSnapshot.child("title").getValue().toString();
           mValueView.setText(Title);

       }

       @Override
       public void onCancelled(DatabaseError databaseError) {

       }
   });

我想显示对象标题是同名值。

这是 Firebase 数据库:

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    如果你只想搜索一次标题值,而不监听更新,你可以简单地使用:

    ref.addListenerForSingleValueEvent(
                        new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
        }});
    

    然后,如果您获得对“用户”的引用,您可以通过迭代执行一些逻辑,例如:

    for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()){
        String title = (String) singleSnapshot.child("title").getValue();
                            //do your logic
                        }
    

    【讨论】:

    • 如何使用singleSnapshot?
    • String title = (String) singleSnapshot.child("title");
    • 我尝试了这段代码,但它出错了。有.getValue() next child("title")?
    • 拿到对象后需要做什么?
    • 当我得到它的时候。我想检查值是否等于名称(EX.name = Chatuchak)并在 textview 上显示 firebase 中的所有子项
    【解决方案2】:

    你的代码有两个问题:

    1. 您指定子节点Users 两次
    2. 查询会产生一个结果列表,您的onDataChange 无法处理这些结果

    两次指定子节点Users

    mRef = FirebaseDatabase.getInstance()
             .getReferenceFromUrl("https://mymap-3fd93.firebaseio.com/Users");
                                                                   // ^^^^^ 
    
    Query query = mRef.child("Users").orderByChild("title").equalTo(name);
                           // ^^^^^ 
    

    容易修复:

    mRef = FirebaseDatabase.getInstance()
             .getReferenceFromUrl("https://mymap-3fd93.firebaseio.com/");
    
    Query query = mRef.child("Users").orderByChild("title").equalTo(name);
    

    我不确定你为什么要使用getReferenceFromUrl() 开头。对于大多数应用程序来说,这实现同样简单:

    mRef = FirebaseDatabase.getInstance().getReference();
    

    一个查询产生一个结果列表

    当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

       query.addValueEventListener(new ValueEventListener() {
           @Override
           public void onDataChange(DataSnapshot dataSnapshot) {
               for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                   System.out.println(snapshot.getKey());
                   System.out.println(snapshot.child("title").getValue(String.class));
               }
           }
    
           @Override
           public void onCancelled(DatabaseError databaseError) {
               throw databaseError.toException();
           }
       });
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多