java - 如何在firebase中存储每个键的所有值

标签 java android firebase-realtime-database

如图所示,不同日期有不同的药物 喜欢

2019-12-27 Medicine ALTISGPT => "72 u/L"
2019-12-26 Medicine ALTISGPT => "74 u/L"
2019-12-25 Medicine ALTISGPT => "74 u/L"

我想将 MedicineName 映射到具有不同日期的该药物的所有值,例如

ALTISGPT =>["72 u/L","74 u/L","74 u/L"]

所以我尝试创建一个 HashMap 并考虑在出现相同名称时推送值。

首先我将所有内容添加到数组列表中,然后匹配并添加到 vector 中

mUserDatabase=FirebaseDatabase.getInstance().getReference().child("Users").child(uid).child("Medicines");

final HashMap<String,  Vector > Med=new HashMap<>();
mUserDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {

                //DATES childDataSnapshot.getKey()
                Vector<String> v=new Vector();

                for (DataSnapshot childDataSnapshot2 : childDataSnapshot.getChildren()) {
                    // "MEDICINE NAME" childDataSnapshot2.getKey()
                    arrayList.add(childDataSnapshot2.getKey());

                }}}

        @Override
        public void onCancelled(DatabaseError databaseError) {}});

然后我这样做了:

    for(int i=0;<arrayList.size();i++){
    mUserDatabase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {

                //DATES childDataSnapshot.getKey()
                Vector<String> v=new Vector();

                for (DataSnapshot childDataSnapshot2 : childDataSnapshot.getChildren()) {
                    // "MEDICINE NAME" childDataSnapshot2.getKey()
                    if(arrayList.get(i).equals(childDataSnapshot2.getKey()))
                       v.add(childDataSnapshot2.getValue().toString());


                }}}

        @Override
        public void onCancelled(DatabaseError databaseError) {}});

        Med.put(childDataSnapshot2.getKey(),v);
        }

但还有一个问题,我知道 Firebase 是异步的,所以如何解决这个问题,这就是为什么我认为我的数组列表是空的 我看到了一些,但无法弄清楚,是不是有些东西不完整

enter image description here

最佳答案

请尝试以下操作以获得结果:

mUserDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(uid).child("Medicines");
final HashMap<String, Vector> Med = new HashMap<>();

mUserDatabase.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot childDataSnapshot : dataSnapshot.getChildren()) {
            for (DataSnapshot childDataSnapshot2 : childDataSnapshot.getChildren()) {
                // "MEDICINE NAME" childDataSnapshot2.getKey()

                Vector vector;

                if(Med.containsKey(childDataSnapshot2.getKey())) {
                    vector = Med.get(childDataSnapshot2.getKey());
                } else {
                    vector = new Vector();
                    Med.put(childDataSnapshot2.getKey(), vector);
                }

                vector.add(childDataSnapshot2.getValue(String.class));
            }
        }

        //Here Med contains all the data 
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

无需在循环内使用第二个查询。删除该内容

关于java - 如何在firebase中存储每个键的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517582/

相关文章:

java - 使用 Gson 将 JSON 反序列化为对象

ios - Swift-Firebase 多个观察者

firebase - Firebase Bolt 规则是否已弃用?

java - 如何清除 Java HttpServletResponse 的屏幕输出

java - 如何使用maven构建docker镜像?

java - 获取集合元素的最快方法是什么?

android - 如何在 firebase 上节省时间(日/月/年)?

java - char 文字 '\"' 与 '"' 相同吗?(反斜杠双引号与仅双引号)

android - 如何在sqlite中删除数据库?

android - Android 5.1 中的 AlarmManager setExact