【问题标题】:Querying data from Firestore to Arraylist but got nothing?从 Firestore 查询数据到 Arraylist 但一无所获?
【发布时间】:2023-03-06 09:05:01
【问题描述】:

我在 ArrayList 中添加数据时遇到问题。 我试图在数组列表中添加数据但什么也没得到

这是我的代码

public class fmMain extends Fragment {
     private ArrayList<markerList> posList = new ArrayList<markerList>();
public fmMain() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                         Bundle savedInstanceState) {


    //Firebase get data
    stores.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
            for (QueryDocumentSnapshot documentSnapshot: queryDocumentSnapshots){
                markerList m = new markerList(documentSnapshot.getId());
                posList.add(m);
            }
            Log.d(TAG,posList.toString()); //got value
        }
    });
    Log.d(TAG,posList.toString()); //got nothing     
}

正如你所见,当我尝试在 onSuccess 函数中添加值时,我得到了已添加的值,但是当我尝试添加外部函数时,我什么也没得到 ​​p>

这是我的数据库结构

【问题讨论】:

  • 嗨,Supagon!请添加您的数据库结构作为屏幕截图以及您的 stores 引用是如何定义的。
  • 好的,我编辑了我的帖子,现在你可以在下面看到我的数据库结构

标签: java android firebase arraylist google-cloud-firestore


【解决方案1】:

您不能简单地在onSuccess() 方法之外使用posList 列表,因为由于此方法的异步行为,它始终是empty。这意味着当您尝试在该方法之外打印 posList.toString() 时,数据尚未从数据库中完成加载,这就是无法访问的原因。快速解决此问题的方法是仅在 onSuccess() 方法中使用列表,如以下代码行所示:

stores.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<GeoPoint> list = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                list.add(document.getGeoPoint("position"));
            }

            //Do what you need to do with your list
        }
    }
});

如果您想在此方法之外使用该列表,我建议您从 post 中查看我的答案,我已在其中解释了如何使用自定义回调解决此问题。您也可以看看这个 video 以获得更好的理解。

【讨论】:

  • 看来你又救了我,非常感谢 Alex 提供我从未了解过的新知识
【解决方案2】:

您收到此错误是因为您将异步调用与同步调用混合在一起。当您从 Firebase 成功接收数据时,将调用 onSuccess 方法(异步)。但是 onCreateView 方法不会等待。会直接进入第二个

Log.d(TAG,posList.toString()); //got nothing

你什么也得不到(实际上我认为你会得到一个空字符串),因为你还没有收到数据。

【讨论】:

  • 没错!!,因为这个,我错过了我的 2 天,非常感谢您
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2018-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多