2017-09-23 4 views
0

그래서 firebase 데이터베이스에서 사용자 프로필 정보를 검색하여 Android 앱에 표시하려고하지만 전혀 작동하지 않습니다!Firebase에서 값을 가져 와서 EditText에 표시

다음은 시도한 코드입니다.하지만 운이 전혀 없습니다! 내가 여기서 0 도시 한 OnCreate 방법 ArrayList의 크기를 인쇄하려고

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

> 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()을 갖고있는 것 같다. 하나의 사용자로 전체 스냅 샷을 잡고 각 문자열을 목록으로 선택하지 않으려합니다.

난 당신이 모든 사용자를 원한다면 당신이 Users 키에 대한 참조를 설정합니다, 사용자 클래스 데이터 예를 들어


를 저장하는 POJO의 대신 목록을 사용하는 것이 좋습니다 다음 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

코드를 옮겼습니다. 이제 get (1)을 호출했기 때문에이 오류가 "java.lang.IndexOutOfBoundsException : Index : 1, Size : 1 at java.util.ArrayList.get (ArrayList.java:411)"이고 앱이 중지되었습니다. –

+0

예, '모든 데이터가로드되기 전에 –

+0

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