Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何通过FirebaseFirestore查询从类中的方法检索数据列表?_Android_Firebase_Google Cloud Firestore - Fatal编程技术网

Android 如何通过FirebaseFirestore查询从类中的方法检索数据列表?

Android 如何通过FirebaseFirestore查询从类中的方法检索数据列表?,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,我有一个Firebase数据库。 我想创建一个查询并将其放入DBUtils类中的一个方法中,这样我就可以从Android项目中的不同活动调用该查询 例如,类似于: ArrayList<String> aStringArrayList = DBUtils.GetAllJobsOnADate(Date date); . . . // use aStringArrayList to populate a listview. ArrayList aStringArrayList=DBUti

我有一个Firebase数据库。 我想创建一个查询并将其放入DBUtils类中的一个方法中,这样我就可以从Android项目中的不同活动调用该查询

例如,类似于:

ArrayList<String> aStringArrayList = DBUtils.GetAllJobsOnADate(Date date);
.
.
.
// use aStringArrayList to populate a listview.
ArrayList aStringArrayList=DBUtils.GetAllJobsOnADate(日期日期);
.
.
.
//使用aStringArrayList填充listview。

publicstaticarraylistgetjobsonadate(日期){
最终ArrayList mReturnList=新ArrayList();
FirebaseFirestore db=FirebaseFirestore.getInstance();
db.收集(“工作”)
.whereEqualTo(“工作日期”,日期)
.get()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(QuerySnapshot QueryDocumentSnapshot){
用于(QueryDocumentSnapshot QueryDocumentSnapshot:QueryDocumentSnapshot){
mReturnList.add(queryDocumentSnapshot.get(“职务”);
}
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//故障代码
}
});
返回mReturnList;
}
调试应用程序时,我可以看到get()确实返回QuerySnapshotDocument列表(可以看到onSuccessListner代码中的断点),但aStringArray始终为空

尝试使用AsyncTask(onPostExecute)。也不行

当然,如果代码位于同一活动中的函数中,则可以正常工作。但是,这是许多冗余代码散布在许多活动中


有什么想法吗?

唯一的原因是您实际上返回的是一个空列表,该方法是同步的,Firebase对服务器的调用是异步的,因此
返回mReturnListmReturnList.add(queryDocumentSnapshot.get(“职务”)之前调用code>

由于我很长时间没有编写Java,我建议您使用Kotlin实现这一点的一些方法。我将尝试使其类似于Java语法

因此,您应该使用接口与该类通信

您的界面如下所示:

interface Callback {
   fun onListLoaded(list : ArrayList<String>)
}
然后,当加载数据时,在
onSuccessListener
中,以这种方式调用接口:

fun getJobsOnADate(Date date) {
            val db = FirebaseFirestore.getInstance()
            db.collection("jobs")
                    .whereEqualTo("job_date", date)
                    .get()
                    .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                        @Override
                        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                            val list : ArrayList<String> = ArrayList()
                            for (queryDocumentSnapshot in queryDocumentSnapshots) {
                                 list .add(queryDocumentSnapshot.get("job_title"))                                                                        
                            }

                            //Here goes the magic:
                            listener.onListLoaded(list)
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // failure code 
                        }
                    })
        }

当调用firebase的
onSuccessListener
并解析所有数据时,活动中的
onListLoaded
将使用交互程序发送的列表进行调用。

以下是上述答案的Java实现

static GetJobsOnADate(Date date, MyCallbackInterface callback) {
            final ArrayList<String> mReturnList = new ArrayList<String>();
            FirebaseFirestore db = FirebaseFirestore.getInstance();
            db.collection("jobs")
                    .whereEqualTo("job_date", date)
                    .get()
                    .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                        @Override
                        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                            for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {
                                 mReturnList.add(queryDocumentSnapshot.get("job_title"));
                                }
                            callback.OnDataReceived(mReturnList);
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // failure code 
                        }
                    });

        }
静态GetJobsOnADate(日期日期,MyCallbackInterface回调){
最终ArrayList mReturnList=新ArrayList();
FirebaseFirestore db=FirebaseFirestore.getInstance();
db.收集(“工作”)
.whereEqualTo(“工作日期”,日期)
.get()
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(QuerySnapshot QueryDocumentSnapshot){
用于(QueryDocumentSnapshot QueryDocumentSnapshot:QueryDocumentSnapshot){
mReturnList.add(queryDocumentSnapshot.get(“职务”);
}
callback.OnDataReceived(mReturnList);
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//故障代码
}
});
}
以及回调接口:

class MyActivity() : Activity(), Callback /*<- your interface*/ {
  ...
  //You implement the method which is signed in your interface.
  override fun onListLoaded(list : ArrayList<String>) {
    //here you can use the list
    list.forEach { ... }
  }

}
interface MyCallbackInterface{
    void onDataReceived(ArrayList<String> data);
接口MyCallbackInterface{
接收到无效数据(ArrayList数据);

}

get()是异步的,会立即返回。它不会等待结果发送到回调。请检查副本,看看如何使用Java.WoW解决这个问题。在事件驱动的编程世界中,这是非常复杂和简单的。我应该考虑事件驱动编程,但我缺乏编程经验。非常感谢你,塔米姆。我会试试看,明天再给你打勾。是的,我正在认真考虑换到科特林。嗯,工作很有魅力。再次感谢。事实上,我最终将回调作为一个参数传递(根据Wambada的建议),并给回调本身一个对象数组而不是ArrayList,只是为了使它更通用。使用其他参数传递回调不是最佳做法,但它是有效的,如果它感到舒服,那么祝你好运!
val firebaseInteractor = FirebaseInterractor()
firebaseInterractor.setListener(this)
firebaseInterractor.getJobsOnADate(date)
static GetJobsOnADate(Date date, MyCallbackInterface callback) {
            final ArrayList<String> mReturnList = new ArrayList<String>();
            FirebaseFirestore db = FirebaseFirestore.getInstance();
            db.collection("jobs")
                    .whereEqualTo("job_date", date)
                    .get()
                    .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                        @Override
                        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                            for (QueryDocumentSnapshot queryDocumentSnapshot : queryDocumentSnapshots) {
                                 mReturnList.add(queryDocumentSnapshot.get("job_title"));
                                }
                            callback.OnDataReceived(mReturnList);
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            // failure code 
                        }
                    });

        }
interface MyCallbackInterface{
    void onDataReceived(ArrayList<String> data);