【问题标题】:Firebase querying dataFirebase 查询数据
【发布时间】:2016-08-18 17:58:50
【问题描述】:
{
  "random_key 1" : {
    "id": 0,
    "text": "This is text"
  },
  "random_key 2" : {
    "id": 1,
    "text": "This is text"
  }
}

如果我像这样存储我的数据,并且我想获得id 等于0 的节点。我该怎么做?

上面是issue的孩子,是root的孩子。

【问题讨论】:

  • 我的问题措辞有点不同,但我帖子中的答案应该对您有所帮助。 stackoverflow.com/questions/39023945/…
  • 如果您已经有一个现有的 ID,为什么不将数据存储在该 ID 下?这将使查找变得更加容易。
  • @FrankvanPuffelen 我已将所有数据存储在 ID 下;我需要为该 ID 上的 orderbychild 查询传递哪个值?

标签: android firebase firebase-realtime-database


【解决方案1】:

在您的情况下,您必须像这样设置查询:

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

Query query = reference.child("issue").orderByChild("id").equalTo(0);
query.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            // dataSnapshot is the "issue" node with all children with id 0
            for (DataSnapshot issue : dataSnapshot.getChildren()) {
                // do something with the individual "issues"
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

【讨论】:

  • 你能帮我解决这个问题中的同类问题吗:-stackoverflow.com/q/42502024/3946958 ...你能告诉我你的答案中的“问题”是什么吗????
  • 它对我有用,但你能告诉我们如何使用多个选项过滤数据..比如来自国家、州、城市的用户
  • 但是如果我不想通过 orderByChild 订购怎么办?我只想按 id 匹配...对我来说排序结果是额外的计算。
  • @dsharew 你需要 orderByChild 或 orderByKey,否则它怎么知道你想通过“id”而不是另一个子属性来匹配,在这个例子中,“text”。您的另一个选择是将 id 设为键,那么您就不需要查询了。
  • @Linxy 感谢您的响应,这在 firebase 中似乎是不可能的,但在其他数据库引擎上,无需排序即可匹配。
【解决方案2】:

@Linxy 的回答是正确的,但由于您将从数据库中读取项目列表,因此最好使用子事件侦听器而不是值事件侦听器。

DatabaseReference reference = FirebaseDatabase.getInstance().getReference();

Query query = reference.child("issue").orderByChild("id").equalTo(0);
query.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        //Do something with the individual node here`enter code here`
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }


});

【讨论】:

    【解决方案3】:

    此代码适用于我

    Query query = mFirebaseDatabase.child("issue").orderByChild("id").equalTo(0)
        query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(final DataSnapshot dataSnapshot) {
                        for (DataSnapshot data : dataSnapshot.getChildren()) {
                         //If email exists then toast shows else store the data on new key
                            if (!data.getValue(User.class).getEmail().equals(email)) {
                                mFirebaseDatabase.child(mFirebaseDatabase.push().getKey()).setValue(new User(name, email));
                            } else {
                                Toast.makeText(ChatListActivity.this, "E-mail already exists.", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
        
                    @Override
                    public void onCancelled(final DatabaseError databaseError) {
                    }
                });
    

    【讨论】:

    • 虽然您的解决方案仍然适用,但它非常昂贵,因为它发生在客户端。假设您有 1000 条记录。获取所有这些记录(使用onDataChange())并遍历所有记录对客户端来说是一项非常昂贵的任务。
    【解决方案4】:

    对于 Firebase 的易于使用的跨平台集成,您还可以查看 V-Play Engine for mobile apps

    FirebaseDatabase {
      id: firebaseDb
    
      Component.onCompleted: {
        //use query parameter:
        firebaseDb.getValue("public/bigqueryobject", {
                       orderByKey: true,  //order by key before limiting
                       startAt: "c",      //return only keys alphabetically after "c"
                       endAt: "m",        //return only keys alphabetically before "m"
                       limitToFirst: 5,   //return only first 5 sub-keys
        })
      }
    }
    

    【讨论】:

    • 虽然您提供了一个答案很好,但它并没有真正帮助,因为它与所提出的问题无关。如何?技术环境的差异。 OP问了一个与Android开发有关的问题。您的解决方案适合 Qt 环境。
    【解决方案5】:

    如何在 firebase 中使用这个 SQL 查询?

    选择第 1 列,第 2 列,... FROM 表名 WHERE 条件1 OR 条件2 OR 条件3 ...;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 1970-01-01
      • 2018-07-22
      • 2017-11-24
      • 2019-07-28
      • 2018-06-05
      • 2018-04-16
      • 1970-01-01
      相关资源
      最近更新 更多