【问题标题】:Perform key Specific Query in Firebase在 Firebase 中执行关键特定查询
【发布时间】:2018-04-16 08:18:21
【问题描述】:

我有这种方式的数据库结构

-... location
    -... messages
        -... id1_id2
        -... id3_id4
        -... id5_id6
        .
        .
        .

如何访问消息中的对象,我只知道id1 这是关键。

TIA。

【问题讨论】:

  • 数据库中的 id2 是什么?
  • id1_id2 是标识两个ID之间对话的组合。
  • 你需要知道 id1_id2 才能访问
  • 我之前说过,你需要改变数据库结构
  • @kashyapjimuliya 你是什么意思? Levi 的答案总是会给出以 id1.. 开头的答案。

标签: java android firebase firebase-realtime-database


【解决方案1】:

将您的数据库更改为:

Messages
   userid1
     userid2
        message: hello

然后要检索message,请执行以下操作:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Messages").child(userid1);
ref.addListenerForSingleValueEvent(new ValueEventListener(){
  @Override
public void onDataChange(DataSnapshot dataSnapshot){
  for (DataSnapshot ds : dataSnapshot.getChildren()) {
    String messages=ds.child("message").getValue().toString();


    }
  }
});

【讨论】:

  • 我不能在这里更改架构彼得。并且我无法获取id2发送的消息
  • 如果你不想改变方案,那么只有 id1 是行不通的。如果您可以同时拥有两个 id,那么您可以使用orderByChild("id1_id2").equalTo(the_ids)。但无论如何你想检索什么?
  • 我打算检索这个对象内部的聊天数组。无论如何,非常感谢您的帮助。正如你所说,只有id1 不起作用,但同样没有其他方法可以做到这一点,只能获取整个数据库并相应地对其进行过滤。
  • 最好不要使用数组但是,是的,在这种情况下这是唯一的方法
  • 您的回答很有帮助。但我无法将其标记为正确,因为我的问题仍然需要令人信服的答案。
【解决方案2】:

假设你的结构是这样的:

您可以这样做,这将从 messages 中获取所有 id1 开始 的节点:

String id1 = "id1";
        DatabaseReference ref = FirebaseDatabase.getInstance().getReference("messages");
        ref.orderByKey().startAt(id1).endAt(id1 + "\uf8ff").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot snap : dataSnapshot.getChildren()) {
                    Log.d("SNAP", snap.getValue(String.class));
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

我从 javascript implementation 中获得了这个想法,但它也适用于 Android,我已经在我的设备/数据库上运行了测试。请注意,此方法将用于抓取具有给定 id 的开始的数据。

编辑:

在这个官方post中讨论了查询包含某个字符串的firebase数据的想法。此外,这个question 也是如此。底线是 api 不支持这些类型的查询,我上面提到的方法是在 firebase 中实现“SQL LIKE”最接近的方法。目前,无法搜索以另一个字符串结尾的字符串。 endAt 并不意味着字符串以 id1 结尾,而是我要检索的值范围在 (id1 + "\uf8ff") 处结束,这意味着任何以 id1 开头的字符串。 您的选择是更改架构或获取所有消息并在本地搜索(其他两个答案的建议)。

【讨论】:

  • endAt()可以达到同样的效果吗?
【解决方案3】:

试试这个

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("location/messages");
ref.addListenerForSingleValueEvent(new ValueEventListener(){

@Override
public void onDataChange(DataSnapshot dataSnapshot){
   for (DataSnapshot ds : dataSnapshot.getChildren()) {
     if(ds.getKey().contains("bob")){
           //Do something with the date
           break;
       }
     }
   }
});

【讨论】:

  • 这是我在本地做的,但这需要使用查询直接在数据库上完成,因为有很多不必要的数据占用了我的 firebase 数据库带宽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多