Firebase中的查询-云数据库

时间:2019-01-16 08:53:31

标签: java android firebase google-cloud-firestore

我正在开发一个Android应用程序,因此决定将数据保存在Firebase中。目前,我在加载数据时遇到了一个障碍。 首先,我想展示一下应用程序的体系结构:

Architecture of application

在方法OnCreate中创建 FirebaseHandler 的实例(它是单例类)。实例存在后,MainActivity调用方法 nameOfMember

 public void nameOfMember() {
    DocumentReference documentReference = db.document(pathTOOffersPrefix + userID);
    Log.d(TAG, "nameOfMember: " + pathTOOffersPrefix + userID);

    documentReference.get()
            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                @Override
                public void onSuccess(DocumentSnapshot documentSnapshot) {
                    if (documentSnapshot.exists()) {
                        String name = documentSnapshot.getString(ARG_Firebase_User_Name);
                        String surname = documentSnapshot.getString(ARG_Firebase_User_SurName);
                        setName(name);
                        setSurname(name);
                        Log.d(TAG, "onSuccess: " + name + " " + surname);
                    } else {
                        Log.d(TAG, "onSuccess: but not exist");
                    }

                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG, "onFailure: " + e.getMessage());
                }
            });
}

此方法设置了FirebaseHandler实例的两个参数(供将来使用)。它正在工作,但是现在出现了问题。在 Main.java 中,我尝试获取以下参数:

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firebaseHandler = FirebaseHandler.getInstance();
        firebaseHandler.getName();
        firebaseHandler.getSurname();
}

主要问题是,方法Main.onCreate的确定要早于FirebaseHandler.onSuccess。

我想问一下,是否有人知道如何解决(某些回调?)。

1 个答案:

答案 0 :(得分:1)

是的,这是后台处理的正常行为,因为Firebase数据库功能是在单独的线程中执行的,那么您需要执行以下操作:

  1. 创建一个interface作为getString()方法的侦听器:

    public interface OnValueReadyListener {
        void onValueReady(String name, String surName);
    }
    
  2. 将接口的实例传递给nameOfMember方法:

    public void nameOfMember(OnValueReadyListener listener) {
        ...
    }
    
  3. onSuccess方法内,调用侦听器:

    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        if (documentSnapshot.exists()) {
            String name = documentSnapshot.getString(ARG_Firebase_User_Name);
            String surname = documentSnapshot.getString(ARG_Firebase_User_SurName);
            listener.onValueReady(name, surname);
            Log.d(TAG, "onSuccess: " + name + " " + surname);
        } else {
            Log.d(TAG, "onSuccess: but not exist");
        }
    
    }
    
  4. nameOfMember调用方法onCreate,如下所示:

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        firebaseHandler = FirebaseHandler.getInstance();
        firebaseHandler.nameOfMember(new OnValueReadyListener() {
             public void onValueReady(String name, String surName) {
                 // Do what you need here. you have the values ready
             }
        });
    
    }