Android Firebase addValueEventListener извините позже в цикле - PullRequest
0 голосов
/ 16 февраля 2019

Это код HomePage.java

 ProfileDetail pd=new ProfileDetail(Email1);
                Log.d("TAG","profile in HomePage");
                Profile p=pd.getAllDetails();
                Log.d("TAG","profile after Method in HomePAge");

, и это мой класс ProfileDetail:

public class ProfileDetail implements Parcelable {


private  String mailId;
private Profile profile;
DatabaseReference  mDatabase= 
FirebaseDatabase.getInstance().getReference("users").child("profile");
Profile pp=null;

protected ProfileDetail(Parcel in) {
    mailId = in.readString();
}

public static final Creator<ProfileDetail> CREATOR = new Creator<ProfileDetail>() {
    @Override
    public ProfileDetail createFromParcel(Parcel in) {
        return new ProfileDetail(in);
    }

    @Override
    public ProfileDetail[] newArray(int size) {
        return new ProfileDetail[size];
    }
};

public String getMailId() {
    return mailId;
}

public void setMailId(String mailId) {
    this.mailId = mailId;
}



public ProfileDetail(String mailId)
{
 Log.d("TAG","profile inside ProfileDetail mail= "+mailId);
 this.mailId=mailId;
    readData(new FireBaseCallBack() {
        @Override
        public void onCallback(Profile p)
        {
            profile=p;
            Log.d("TAG","profile inside  louda pp="+p.toString());

            Log.d("TAG","profile inside  louda");
        }
    });
}

public Profile getAllDetails()
{

    Log.d("TAG","profile inside getALLDEtails");

    Log.d("TAG","profile inside  getALlDetails pp="+profile.toString());


return profile;
}

public void readData(final FireBaseCallBack fireBaseCallBack)
{
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren())
        {
            Log.d("TAG","profile inside 1st datasnapshot");
            for (DataSnapshot dataSnapshot2:dataSnapshot1.getChildren())
            {
                if (mailId.equals(dataSnapshot2.getValue(String.class)))
                {
                    pp =dataSnapshot1.getValue(Profile.class);
                    Log.d("TAG","profile inside 2nd datasnapshot");
                    // p[0] =pp;
                }


            }


        }
        fireBaseCallBack.onCallback(pp);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
});
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel parcel, int i) {
    parcel.writeString(mailId);
}


private interface FireBaseCallBack
{

    void onCallback(Profile p);
}
}

Я получаю этот результат

профиль в профиле HomePage внутриПрофиль getALLDEtails, выходящий за пределы Профиль getALLDEtails после метода в профиле HomePAge внутри 1-го профиля datasnapshot внутри 1-го профиля datasnapshot внутри 1-го профиля datasnapshot внутри 2-го datasnapshot

Я использую другое решение, представленное здесь, но ничего не получается. Делая это, я всегда получаю объект профилякак ноль, поскольку объект профиля получает значение позже, пожалуйста, помогите мне в этом

I

1 Ответ

0 голосов
/ 16 февраля 2019

Итак, вы просто хотите прочитать значение поля PROFILE из базы данных Firebase только один раз ?

Если это так, вы должны установить для слушателя событие с одним значением , равное

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        // Write you logic here to extract the data 
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
        // ...
      }
});

Кроме того, если вы просто хотите получить ограниченное число детей , вам нужно добавить

.limitToFirst(NUM_COUNT)

например,

mDatabase.limitToFirst(2).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
           // Write your logic here to extract the data
          }

          @Override
          public void onCancelled(DatabaseError databaseError) {
            // ...
          }
    });

База данных Firebase - это база данных в реальном времени, что означает, что если выиспользуйте addValueEventListener () он будет обновлять значение каждый раз, когда изменяется значение базы данных.

Примечание: Обязательно удалите прослушиватель, когда он вам больше не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...