Данные, не вставленные в ArrayList из Firebase - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь добавить данные моего узла Firebase в объект ArrayList. Но данные не заполняются в мой объект ArrayList, и я получаю размер ArrayList равным 0, когда вызывается onPostExecute ().

Как добавить узел Firebase в ArrayList?

Мой android код

public class FirebaseSyncContacts extends AsyncTask<Void,Void,Void> {

    Map<String,String > contacts;
    ArrayList<FirebaseUserModel> userModelObjects;
    Context context;
    public FirebaseSyncContacts(Context context,Map<String,String>contacts)
    {

        this.context=context;
        this.contacts=contacts;
        userModelObjects=new ArrayList<>();

    }

    protected void onPreExecute() {
        Log.i("app","Syncing started");
    }

    protected Void doInBackground(Void... voids) {

        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
        rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(Map.Entry<String, String> singleContact: contacts.entrySet()) {
                    if (dataSnapshot.hasChild(singleContact.getKey())) {
                        Log.i("app", "Present: " + singleContact.getKey());
                        userModelObjects.add(dataSnapshot.getValue(FirebaseUserModel.class));
                    }
                    else {
                        Log.i("app", "Absent: " + singleContact.getKey());
                        userModelObjects.add(dataSnapshot.getValue(FirebaseUserModel.class));
                    }
                }
            }

            public void onCancelled(DatabaseError databaseError) {
                Log.i("app","failed to connect: "+databaseError.getMessage());
            }
        });

        return null;
    }

    protected void onPostExecute(Void aVoid) {
        Log.i("app","total contacts added: "+userModelObjects.size()); // always getting 0 
}
}

FirebaseUserModel. java class

public class FirebaseUserModel {

    private String fname,lname,gender;
    private int isInstalled,day,month,year;

    public FirebaseUserModel() { }

    public FirebaseUserModel(String fname,String lname,String gender,int isInstalled,int day,int month,int year)
    {

        this.fname=fname;
        this.lname=lname;
        this.gender=gender;
        this.isInstalled=isInstalled;
        this.day=day;
        this.month=month;
        this.year=year;
    }
}

Структура Firebase

-Users
    -ContactNo
                -fname
                -lname
                -gender
                -isInstalled
                -day
                -month
                -year

Ожидаемый результат: Следует добавить каждый узел с номером контакта в userModelObjects ArrayList и вернуть onPostExecute () общий размер массива, т. Е. Всего добавленных контактов

Фактический результат: Возвращает размер как 0 после onPostExecute (), т.е. никакой объект не добавлен

РЕДАКТИРОВАТЬ Я получаю предупреждение для каждого номера контакта в виде W / ClassMapper: Нет установщика / поле для 91987654321 найдено в классе com.demo.example.Firebase.FirebaseUserModel

Я удалил ASyncTask, но все еще получаю эту проблему.

1 Ответ

0 голосов
/ 17 апреля 2020

изменить имя класса с:

public class FirebaseUserModel {....

на

public class ContactNo {

для l oop становится:

for( DataSnapshot snapShot: dataSnapshot.getChildren()) {

 ContactNo userModel = snapShot.getValue(ContactNo.class);
 userModelObjects.add(userModel);


}

update

Прежде всего, как я уже сказал, вам не нужен asyncTask, поэтому просто используйте приведенный ниже код везде, где вы хотите sh, потому что firebase обрабатывает потоки backgoround для вас:

//In your activity, do this directly:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Users");
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {

for(DataSnapshot snapShot: dataSnapshot.getChildren()) {

ContactNo userModel = snapShot.getValue(ContactNo.class);
userModelObjects.add(userModel);
}
}

 public void onCancelled(DatabaseError databaseError) {
Log.i("app","failed to connect: "+databaseError.getMessage());
}
});

Это должен быть ваш новый класс

public class ContactNo {

//make sure that these names are exactly like the keys in your database
private String fname,lname,gender;

//note if isInstalled is supposed to be a boolean, then make it a boolean and not an int 
private int isInstalled,day,month,year;

public ContactNo() { }

public ContactNo(String fname,String lname,String gender,int isInstalled,int day,int month,int year)
{

    this.fname=fname;
    this.lname=lname;
    this.gender=gender;
    this.isInstalled=isInstalled;
    this.day=day;
    this.month=month;
    this.year=year;
}

}

...