2016-12-18 59 views
1

我是Firebase的初学者。我可以知道如何使用HashMap从Firebase中的孩子到孩子检索数据?我能否知道如何将ArrayList存储到HashMap中?如果我不使用ArrayList,HashMap可以替换ArrayList吗?如何使用HashMap从Android的Firebase中获取儿童孩子的数据?

我想做的功能,让用户能够将车牌添加到firebase数据库。我将使用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数据库,我尝试map.get所有的值,然后使用setter进行封装。之后,我从firebase-database中删除数据。然后我创建新的对象,然后把所有的任务放在里面。最后,我设置了firebase-database的值。在更新新数据后,Firebase数据库将自动推送到第二级。

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); 
        } 
       } 
      }); 
+0

是否要使用标签(_carPlate)? – Rahul

+0

我认为没有必要,那不是我的要点 – Jane

+0

查看我的答案,并告诉我是否仍然面临任何问题 – Rahul

回答

2

创建提取数据,并从外部通过标签的方法,但必须注意的是标签应该是根节点。

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"); 
+0

好的...非常感谢您 – Jane

+0

如果我遇到问题,我会发邮件给您。因此,你了解我的问题吗? – Jane