【问题标题】:Return only needed values from Firebase从 Firebase 只返回需要的值
【发布时间】:2018-05-27 02:54:39
【问题描述】:

我正在开发一款 Android Messenger 应用。为此,用户需要使用存储在 Firebase 实时数据库中的电话号码进行注册。

要开始给某人发短信,用户应该在他的联系人中拥有数据库上的其他注册用户。

为此,我有一种方法可以从用户手机中检索联系人并在数据库中注册用户。

private List<String> getContactsFromFirebase(final MyCallback myCallback){
    FirebaseDatabase.getInstance().getReference().child("Users")
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                        Users user = snapshot.getValue(Users.class);
                        assert user != null;
                        String contact_found = user.getPhone_number();
                        mContactsFromFirebase.add(contact_found);
                    }
                    myCallback.onCallback(mContactsFromFirebase);
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
    return mContactsFromFirebase;

}

并将在数据库中找到的用户与用户的联系人进行比较

private List<String> findSignedUpContacts(Map<String, String> contactsStored, List<String> firebaseNumbers) {

    List<String> values = new ArrayList<>();
    for (String firebaseNumberKey : firebaseNumbers) {
        values.add(contactsStored.get(firebaseNumberKey));
    }
    return values;
}

现在,我想从 Firebase 数据库中检索有关存储在上面创建的列表中的号码的信息(在数据库和联系人中匹配的号码),并将结果显示在 FirebaseRecyclerAdapter 中。

请问我该怎么做?

这是我的数据库结构。

Users
    5AWIQqYkdoZwFBqM0YrvZiqBj633
        image: "https://firebasestorage.googleapis.com/v0/b/cha..."
        name:  "Plasita"
        phone_number: "+50940404200"
        status: "Coding is my life.."
        thumbnail: "Default"

【问题讨论】:

标签: android firebase firebase-realtime-database android-recyclerview


【解决方案1】:

抱歉,Firebase 中没有通过列表查询的机制,您需要遍历列表并查询每个元素,这非常低效。我的建议是:由于您已经从“用户”节点中获取所有元素,因此将它们存储在辅助数据结构中并对其进行过滤。

 for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
      Users user = snapshot.getValue(Users.class);
      assert user != null;
      String contact_found = user.getPhone_number();
      mContactsFromFirebase.add(user);//this data structure now takes users

  }



private List<User> findSignedUpContacts(Map<String, String> contactsStored, List<User> firebaseUsers) {

    List<User> values = new ArrayList<>();
    for (User user : firebaseUsers) {
        if(contactsStored.containsKey(user.getPhone_number()) 
        {
            values.add(user);
        }
    }
    return values;
}

现在值具有与您手机中的用户匹配的用户数据。

【讨论】:

  • 好的,我明白了,所以您建议使用我自己的 RecyclerView 和我存储的值而不是 FirebaseRecyclerView?
  • 是的,您需要一个查询才能使用 FirebaseRecyclerView,但您不能使用一个查询来检索您想要的所有值。所以是的,你需要实现自己的 RecyclerView
  • 很高兴为您提供帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多