Как получить данные из базы данных Firebase в реальном времени и установить для них класс Singleton - PullRequest
0 голосов
/ 22 сентября 2019

есть некоторые проблемы с всплеском.Когда пользователь вошел в систему, первое открывающееся окно - это всплеск активности.В заставке я проверяю, является ли класс UserSingleton нулевым (например, if (UserSingleton.getInstance == null)).И если он нулевой, я хочу установить данные из базы данных (все данные из пути UserDetails) в класс Singleton (мне это нужно, потому что я буду использовать эти данные больше раз).

Так что у меня есть длясейчас.

Моя всплеск активности:

private FirebaseAuth mAuth;
    private FirebaseDatabase db;
    private DatabaseReference users;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        mAuth = FirebaseAuth.getInstance();
        db = FirebaseDatabase.getInstance();
        users = db.getReference();

        loadUserDetailsData();


    }

    public void loadUserDetailsData() {
        if (UserSingleton.getInstance().getmUserName() == null) {
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {


                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            };
            users.addListenerForSingleValueEvent(eventListener);

        }
    } 

UserSingleton.class

public class UserSingleton {

    private static UserSingleton instance = null;
    private String mUserName;
    private String mEmail;
    private String mPartnerName;
    private String mEventLocation;
    private String mEventDate;
    private String mPassword;

    public String getmPassword() {
        return mPassword;
    }

    public void setmPassword(String mPassword) {
        this.mPassword = mPassword;
    }

    private UserSingleton() {
        //Empty constructor
    }

    public static UserSingleton getInstance() {
        if (instance == null) {
            instance = new UserSingleton();
        }
        return instance;
    }

    public String getmUserName() {
        return mUserName;
    }

    public void setmUserName(String mUserName) {
        this.mUserName = mUserName;
    }

    public String getmEmail() {
        return mEmail;
    }

    public void setmEmail(String mEmail) {
        this.mEmail = mEmail;
    }

    public String getmPartnerName() {
        return mPartnerName;
    }

    public void setmPartnerName(String mPartnerName) {
        this.mPartnerName = mPartnerName;
    }

    public String getmEventLocation() {
        return mEventLocation;
    }

    public void setmEventLocation(String mEventLocation) {
        this.mEventLocation = mEventLocation;
    }

    public String getmEventDate() {
        return mEventDate;
    }

    public void setmEventDate(String mEventDate) {
        this.mEventDate = mEventDate;
    }

Путь к базе данных и данные: enter image description here

Ответы [ 2 ]

0 голосов
/ 22 сентября 2019

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

public void loadUserDetailsData() {
        if (UserSingleton.getInstance().getmUserName() == null) {
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    UserSingleton retrievedData = dataSnapshot.getValue(UserSingleton.class);
                    UserSingleton.getInstance().setmUserName(retrievedData.getmUserName());
                    UserSingleton.getInstance().setmEmail(retrievedData.getmEmail());
                    UserSingleton.getInstance().setmEventDate(retrievedData.getmEventDate());
                    UserSingleton.getInstance().setmEventLocation(retrievedData.getmEventLocation());
                    UserSingleton.getInstance().setmPartnerName(retrievedData.getmPartnerName());

                    Log.d("UserEmailIs " + "email  ", UserSingleton.getInstance().getmUserName());
                    Log.d("UserEmailIs " + "email  ", UserSingleton.getInstance().getmEmail());
                    Log.d("UserEmailIs " + "email  ", UserSingleton.getInstance().getmEventDate());
                    Log.d("UserEmailIs " + "email  ", UserSingleton.getInstance().getmEventLocation());
                    Log.d("UserEmailIs " + "email  ", UserSingleton.getInstance().getmPartnerName());
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            };
            users.addListenerForSingleValueEvent(eventListener);
        }
    }

enter image description here

0 голосов
/ 22 сентября 2019

Singleton в этом случае не работает, во-первых, для извлечения данных с использованием класса модели в firebase вам нужен открытый конструктор, а не private.Во-вторых, шаблон синглтона используется, если вам нужен один объект этого класса, если вы собираетесь извлекать данные из базы данных, вы собираетесь создавать более одного объекта, поскольку у вас есть несколько пользователей.Проверьте это:

https://www.geeksforgeeks.org/singleton-class-java/


Предполагая, что вы изменили синглтон, затем примените следующее к вашему коду:

Затем сначала измените конструктор, чтобы он стал public Users(){}(то есть, если вы изменили имя класса на Users).

Затем, чтобы извлечь данные из базы данных, сначала измените структуру базы данных следующим образом:

Users
   userId
       mEmail : ...
       mEventDate: ...
       mEventLocation : ....
       mPartnerName : ...
       mUserName :   ....

Таким образом, в вашей структуре базы данных удалите узел UserDetails, потому что он немного бесполезен, поскольку вы можете использовать userId для идентификации этого пользователя.Также не используйте password в базе данных, она уже зашифрована при аутентификации в firebase.Если вы хотите добавить его в базу данных, то перед добавлением зашифруйте его.

Затем измените код на следующий:

    users = db.getReference("Users");
    public void loadUserDetailsData() {
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                       Users retrievedData = dataSnapshot.getValue(Users.class);
                       String email        = retrievedData.getmEmail();
                    }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                }
            };
        users.addListenerForSingleValueEvent(eventListener);
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...