如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?

Posted

技术标签:

【中文标题】如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?【英文标题】:How to use HashMap to get the data from child of child in Firebase in android? 【发布时间】:2017-05-03 15:26:38 【问题描述】:

我是 Firebase 的初学者。我可以知道如何使用 HashMap 从 Firebase 中检索子节点的数据吗?我可以知道如何将 ArrayList 存储到 HashMap 中吗?如果不使用ArrayList,HashMap可以代替ArrayList吗?

我想做一个让用户能够将车牌添加到firebase-database的功能。我将使用 ArrayList 让用户将车牌列表添加到系统中。代码会这样显示

List<String>carPlate=new ArrayList<String>();

 mDatabase = FirebaseDatabase.getInstance().getReference();
    user = FirebaseAuth.getInstance().getCurrentUser();
    register.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View view) 
            phone = Phone.getText().toString();
            ic = IC.getText().toString();
            fullname = FullName.getText().toString();
            carplate = CarPlate.getText().toString();
            carPlate.add(carplate);

           //this data will be successful storing in firebase-database and the results will be the images above
            Account account = new Account(fullname, phone, carPlate, ic);
            if(user!=null) 
                mDatabase.child(user.getUid()).setValue(account);
                Toast.makeText(getBaseContext(), "Register Successfully...", Toast.LENGTH_LONG).show();
                Intent in = new Intent(RegisterPage.this, MainActivity.class);
                startActivity(in);
                finish();
            

        
    );

另外,还有一个包含更新函数的类,如下所示: //问题出在这里 现在我想更新数据。根据这个 Firebase-database,我尝试 map.get 所有的值,然后使用 setter 进行封装。之后,我从 firebase-database 中删除数据。然后我创建新对象,然后将所有任务放入其中。最后,我将值设置为 firebase-database。我更新新数据后,firebase-database 会自动推送到二级。

First Results

当我再次更新时,它会再次推送它

Second Results

第二个问题是这一行的NullException:phoneAcc.set_IC(map.get("_IC"));

错误

E/UncaughtException: java.lang.NullPointerException
                     at com.google.online_mobile_flexi_parking.ChangeEmailPassword$8$1.onDataChange(ChangeEmailPassword.java:251)
                     at com.google.android.gms.internal.zzakg.zza(Unknown Source)
                     at com.google.android.gms.internal.zzalg.zzcxk(Unknown Source)
                     at com.google.android.gms.internal.zzalj$1.run(Unknown Source)
                     at android.os.Handler.handleCallback(Handler.java:733)
                     at android.os.Handler.dispatchMessage(Handler.java:95)
                     at android.os.Looper.loop(Looper.java:136)
                     at android.app.ActivityThread.main(ActivityThread.java:5028)
                     at java.lang.reflect.Method.invokeNative(Native Method)
                     at java.lang.reflect.Method.invoke(Method.java:515)
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
                     at dalvik.system.NativeStart.main(Native Method)

这是我的代码:

private List CarPlate;
         changePhone.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                progressBar.setVisibility(View.VISIBLE);
                txtPhone = newPhone.getText().toString().trim();
                if (!txtPhone.equals("")) 
                    mDatabase.child(user.getUid()).addValueEventListener(new ValueEventListener() 
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) 
                            String key=mDatabase.child(user.getUid()).getKey();
                            Account phoneAcc=new Account();
                            Map<String,String>map=(Map)dataSnapshot.getValue();
                            phoneAcc.set_Key(mDatabase.child(user.getUid()).getKey());
                            phoneAcc.set_IC(map.get("_IC"));
                            phoneAcc.set_Phone(txtPhone);
                            phoneAcc.set_FullName(map.get("_FullName"));
                            CarPlate.add(map.get("_CarPlate0"));
                            phoneAcc.set_CarPlate0(CarPlate);

                            //dataSnapshot.getRef().removeValue();

                            mDatabase.child(mDatabase.child(user.getUid()).getKey()).removeValue();
                            Map<String,Object> task=new HashMap<String,Object>();
                            task.put("_FullName",phoneAcc.get_FullName());
                            task.put("_CarPlate0",phoneAcc.get_CarPlate0());
                            task.put("_Phone",phoneAcc.get_Phone());
                            task.put("_IC",phoneAcc.get_IC());
                            mDatabase.child(phoneAcc.get_Key()).setValue(task);
     Toast.makeText(ChangeEmailPassword.this, "Phone Number is updated, sign in with new password!", Toast.LENGTH_SHORT).show();
                                startActivity(new Intent(ChangeEmailPassword.this, MainActivity.class));
                                finish();
                                signOut();
      progressBar.setVisibility(View.GONE);
                            

                            @Override
                            public void onCancelled(DatabaseError databaseError) 

                            
                        );


                     else if (txtPhone.equals("")) 
                        newPhone.setError("Enter phone number");
                        progressBar.setVisibility(View.GONE);
                    
                
            );

【问题讨论】:

你想使用标签(_carPlate)吗? 我觉得没必要,这不是我的重点 检查我的答案,如果您仍然遇到任何问题,请告诉我 您在问题中包含了指向 JSON 树图片的链接。请将其替换为作为文本的实际 JSON,您可以通过单击 your Firebase Database console 中的导出 JSON 链接轻松获得该文本。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。 @FrankvanPuffelen 同意,我检查了三次,是否输入了正确的密钥标签。 【参考方案1】:

创建一个方法来从外部提取数据和传递标签,但必须注意标签应该在根节点上。

public void fetchData(@NonNull String tag) 
    final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference()
            .child(tag);
    databaseReference.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) 
               String value = dataSnapshot.getValue(String.class);
               Log.d("Value is", value);
         
        

        @Override
        public void onCancelled(DatabaseError databaseError) 
        
    );

像这样从您的活动中调用此方法 -

fetchData("_CarPlate");

【讨论】:

如果我有问题我会发邮件给你。所以,你明白我的问题吗?

以上是关于如何使用 HashMap 从 Android 的 Firebase 中的子节点获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中打印 HashMap 中的所有键和值?

通过位置或索引从Android中的HashMap获取键

从 URL 获取 JSON 数组并将其转换为 Android 中的 HashMap

如何将屏幕坐标插入hashmap android

如何在android中将HashMap转换为json数组?

Android Gems — Java源码分析之HashMap和SparseArray