2016-12-18 10 views
1

私はFirebaseの初心者です。 HashMapを使用してFirebaseから子供から子供のデータを取得する方法を知っていますか? ArrayListをHashMapに格納する方法を知っていますか?私がArrayListを使用しない場合、HashMapはArrayListを置き換えることができますか?HashMapを使用して、アンドロイドで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(); 
      } 

     } 
    }); 
} 

のように表示されます、他の以下に示すように、更新機能が含まれているクラス: //問題は、今私は、データを更新するAT HERE
です。このFirebaseデータベースによれば、私はマップを作成しようとしています。すべての値を取得し、カプセル化にsetterを使用します。その後、firebase-databaseからデータを削除します。それから、新しいオブジェクトを作成し、すべてのタスクを内部に配置します。最後に、私はfirebase-databaseにsetvalueを設定します。新しいデータを更新すると、firebaseデータベースは自動的に2番目のレベルにプッシュされます。

First Results

私は再び更新した場合、それは

Second Results

第二の問題は、この行でNullExceptionで再びそれをプッシュします:()map.get( "_ IC")phoneAcc.set_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

ok ...大変ありがとうございます – Jane

+0

問題があればメールをお送りします。したがって、あなたは私の質問を理解していますか? – Jane

関連する問題