繁体   English   中英

如何从 firebase 实时数据库中获取数据并将其设置为 Singleton class

[英]How to get data from firebase realtime database and set it to Singleton class

我的飞溅活动有问题。 当用户登录时,打开的第一个屏幕是 Splash 活动。 在启动活动中,我正在检查 UserSingleton class 是否为 null(如 if(UserSingleton.getInstance==null))。 如果它是 null,我想将数据库中的数据(来自 UserDetails 路径的所有数据)设置为 Singleton class(我需要它,因为我会多次使用这些数据)。

所以我现在有什么。

我的飞溅活动:

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

        }
    } 

用户单例.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;
    }

数据库路径和数据: 在此处输入图像描述

Singleton 在这种情况下不起作用,首先使用 model class 在 ZBF12E1515C2413AB7D8C0352 中获取数据 Second, singleton pattern is used if you want one object of that class, if you are going to retrieve data from the database you are going to be creating more than one object since you have multiple users. 检查这个:

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


假设您从 singleton 更改然后将以下内容应用于您的代码:

然后首先将构造函数更改为public Users(){} (也就是说,如果您将 class 的名称更改为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);
      }

朋友们,我设法做到了下一个方法,但不确定这是不是好方法。 我这样做的唯一原因是因为我想在应用程序加载时引入一定数量的数据。 如果有人知道更好的方法,我很乐意。

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

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM