2017-09-23 54 views
0

因此,我試圖從我的Firebase數據庫中檢索用戶配置文件信息以將其顯示在我的Android應用程序中,但它似乎根本無法工作!檢索Firebase中的值並在EditText中顯示

這是我嘗試過的代碼,但沒有運氣!

package com.example.ravneet.bloodhub; 

import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.TextView; 

import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.ChildEventListener; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; 

import java.util.ArrayList; 

public class Editprofile extends AppCompatActivity { 
    TextView chngpsw; 
    EditText name, state, city, bloodgrp, mobileno, email; 
    FirebaseUser currentFirebaseUser; 
    String id; 
    private static final String TAG = "EditProfile"; 
    ArrayList<String> mylist; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_editprofile); 
     mylist = new ArrayList<String>(); 
     chngpsw = (TextView) findViewById(R.id.chngpsw); 
     currentFirebaseUser = FirebaseAuth.getInstance().getCurrentUser(); 
     id = currentFirebaseUser.getUid(); 
     setTitle("Edit Profile"); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     name = (EditText) findViewById(R.id.name); 
     state = (EditText) findViewById(R.id.state); 
     city = (EditText) findViewById(R.id.city); 
     bloodgrp = (EditText) findViewById(R.id.bloodgrp); 
     mobileno = (EditText) findViewById(R.id.mobileno); 
     email = (EditText) findViewById(R.id.email); 
     chngpsw.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent i = new Intent(getApplicationContext(), Changepswrd.class); 
       startActivity(i); 
      } 
     }); 
     readData(); 
     if(mylist.size() != 0){ 
      setvalues(); 
     } 
     //Log.d(TAG, "SIZE IS on Create " + mylist.size()); 
    } 

    private void readData() { 

     DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Users").child(id); 
     // Log.d(TAG, "UserID is " + id); 
     ref.addChildEventListener(new ChildEventListener() { 
      @Override 
      public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
       fetchdata(dataSnapshot); 

      } 

      @Override 
      public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
       fetchdata(dataSnapshot); 
      } 

      @Override 
      public void onChildRemoved(DataSnapshot dataSnapshot) { 

      } 

      @Override 
      public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 
     Log.d(TAG, "Bottom Size : " + mylist.size()); 

    } 
    private void fetchdata(DataSnapshot dataSnapshot){ 
     String value = dataSnapshot.getValue(String.class); 
     //Log.d(TAG, "Value is " + value); 
     mylist.add(value); 
     Log.d(TAG, "Size : " + mylist.size()); 
    } 
    private void setvalues(){ 
     bloodgrp.setText(mylist.get(0)); 
     city.setText(mylist.get(1)); 
     email.setText(mylist.get(2)); 
     mobileno.setText(mylist.get(3)); 
     name.setText(mylist.get(4)); 
     state.setText(mylist.get(5)); 
    } } 

,當我試圖打印尺寸在onCreate方法的ArrayList它顯示0 這裏是它顯示在logcat的

> D/EditProfile: UserID is MkfeHsMuJyaNr5Be8R7eRojHngE2 09-24 
> D/EditProfile: Bottom Size : 0 
> D/EditProfile: Size : 1 
> D/EditProfile: Size : 2 
> D/EditProfile: Size : 3 
> D/EditProfile: Size : 4 
> D/EditProfile: Size : 5 
> D/EditProfile: Size : 6 

Here is Firebase Database

這裏是火力地堡數據庫

回答

0

您似乎誤解了Firebase是異步的。


您需要移動這些行。

setvalues(); 

Log.d(TAG, "Bottom Size : " + mylist.size()); 

在這裏。

ref.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      fetchdata(dataSnapshot); 
      Log.d(TAG, "Bottom Size : " + mylist.size()); 
      setvalues(); 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 
      fetchdata(dataSnapshot); 
      Log.d(TAG, "Bottom Size : " + mylist.size()); 
      setvalues(); 
     } 

但是,你似乎有fetchdata()在快照數據中的太遠「向下」。您想以一個用戶的身份抓取整個快照,而不是將每個字符串挑出到列表中。

我建議你使用POJO的,而非列表存儲用戶級數據


例如,如果你想所有的用戶,您將設置在Users關鍵的參考,那麼DataSnapshot是每個用戶值,而不是其中的數據。

final FirebaseDatabase database = FirebaseDatabase.getInstance(); 

// Here not just getting one ID 
DatabaseReference ref = database.getReference().child("Users"); 

// Attach a listener to read the data at the Users reference 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     User user = dataSnapshot.getValue(User.class); 
     // userList.add(user); // for example 
    } 

使用database.getReference().child("Users").child(id);也可能適用於此模式。

+0

我移動了代碼。現在我得到這個錯誤「java.lang.IndexOutOfBoundsException:Index:1,Size:1 at java.util.ArrayList.get(ArrayList.java:411)」and app stopped –

+0

是的,因爲你調用'get(1) '在全部加載數據之前加上 –

+0

'city.setText(mylist.get(1));' –

相關問題