【问题标题】:How to get data from firebase realtime database and set it to Singleton class如何从 firebase 实时数据库中获取数据并将其设置为 Singleton 类
【发布时间】:2019-09-22 17:25:32
【问题描述】:

我的启动活动有些问题。 当用户登录时,打开的第一个屏幕是 Splash 活动。 在启动活动中,我正在检查 UserSingleton 类是否为空(例如 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;
    }

数据库路径和数据:

【问题讨论】:

  • 请仅使用android-studio 标签来回答有关 Android Studio IDE 本身的问题。对于一般的 Android 编程问题,请使用android 标签。

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


【解决方案1】:

单例在这种情况下不起作用,首先要使用 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);
      }

【讨论】:

  • 我可能没有很好地解释自己。我只想创建一个对象。该对象将包含当前登录的用户信息。我通过 mAuth.getCurrentUser.getUid 获取他的 id。然后我想把他所有的数据从一个数据库中拉出来放到Singleton类中。
  • 毕竟单例类的生命周期是直到应用被销毁。这就是为什么我想在应用加载中更新这个类,我从数据库中获取数据
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多