Android 如何通过FirebaseFirestore查询从类中的方法检索数据列表?
我有一个Firebase数据库。 我想创建一个查询并将其放入DBUtils类中的一个方法中,这样我就可以从Android项目中的不同活动调用该查询 例如,类似于: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
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对服务器的调用是异步的,因此
返回mReturnList在mReturnList.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);