如何从Firebase实时数据库获取数据并将其设置为Singleton类

时间:2019-09-22 17:25:32

标签: java android firebase firebase-realtime-database singleton

我的飞溅活动有问题。 当用户登录时,打开的第一个屏幕是Splash活动。 在启动活动中,我正在检查UserSingleton类是否为null(例如if(UserSingleton.getInstance == null))。 如果它为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 :(得分:0)

在这种情况下,Singleton不起作用,首先要使用Firebase中的模型类检索数据,需要一个非私有的公共构造函数。其次,如果您想要该类的一个对象,则使用单例模式;如果您要从数据库中检索数据,则由于您有多个用户,因此您将创建多个对象。检查一下:

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

答案 1 :(得分:0)

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

export default {
  install(Vue, options) {
    Vue.mixin({
      computed: {
        watchedComponents() {
          return this._data // Is there some other way to obtain the component data ???
        }
      },
      watch: {
        watchedComponents: {
          deep: true, // For watching nestead changes
          handler() {
            // At this point I start receive recursion errors.
          }
        }
      }
    })
  }
}

enter image description here