java - Android Studio 中的 Firestore 引用

标签 java android firebase google-cloud-firestore

我在引用嵌套的特定集合(我认为该术语)时遇到一些问题,我在下面附加了数据库结构的图像:

enter image description here

编辑:食品系列的图像 enter image description here

我基本上有多个文档,其中有一个同名的集合。有没有一种方法可以根据用户在上一页上单击的餐厅 ID 动态选择“Foods”集合。即,如果用户选择 ID 为 01 的餐厅,则应从 ID 为 01 的文档中加载“Foods”,依此类推。

这是我加载食物的 fragment 代码:


import android.content.Context;
import android.net.Uri;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.example.hostapp.Adapters.FoodAdapter;
import com.example.hostapp.Models.FoodModel;
import com.example.hostapp.R;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;


public class MainsFragment extends Fragment {

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference menuref = db.collection("Foods");


    private FoodAdapter adapter;

    String restaurantid = "";


    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_mains, container, false);


        Query query = menuref.whereEqualTo("menuid", restaurantid).orderBy("name");

        FirestoreRecyclerOptions<FoodModel> options = new FirestoreRecyclerOptions.Builder<FoodModel>().
                setQuery(query, FoodModel.class)
                .build();

        adapter = new FoodAdapter(options);

        RecyclerView recyclerView = view.findViewById(R.id.recycler_mains);
        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));
        recyclerView.setAdapter(adapter);


        return view;
    }

    private void setUpRecyclerView() {


    }

    @Override
    public void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    public void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

点击上一页:


import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.RelativeLayout;

import com.example.hostapp.Adapters.RestaurantAdapter;
import com.example.hostapp.Adapters.categoryCardAdapter;
import com.example.hostapp.Models.Restaurant;
import com.example.hostapp.Models.categoryCard;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;

public class RestaurantList extends AppCompatActivity {

    private FirebaseFirestore db = FirebaseFirestore.getInstance();
    private CollectionReference restaurantref = db.collection("restaurants");
    private RestaurantAdapter adapter;

    String categoryid="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_restaurant_list);

        setUpRecyclerView();
    }

    private void setUpRecyclerView(){


        //Get intent
        if(getIntent() != null)
            categoryid = getIntent().getStringExtra("categoryid");
        if(!categoryid.isEmpty() && categoryid != null)
        {
            Query query = restaurantref.whereEqualTo("categoryid", categoryid).orderBy("name");

            final FirestoreRecyclerOptions<Restaurant> options = new FirestoreRecyclerOptions.Builder<Restaurant>().setQuery(query, Restaurant.class).build();

            adapter = new RestaurantAdapter(options);

            RecyclerView recyclerView = (RecyclerView) findViewById(R.id.restaurant_recycler);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this));
            recyclerView.setAdapter(adapter);

            adapter.setOnItemClickListerner(new RestaurantAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(DocumentSnapshot documentSnapshot, int position) {
                    Restaurant restaurant = documentSnapshot.toObject(Restaurant.class);
                    Intent foodlist = new Intent(RestaurantList.this, Foodlist.class);
                    foodlist.putExtra("restaurantid", documentSnapshot.getId());
                    startActivity(foodlist);

                }
            });
        }
    }



    @Override
    protected void onStart() {
        super.onStart();
        adapter.startListening();
    }

    @Override
    protected void onStop() {
        super.onStop();
        adapter.stopListening();
    }
}

最佳答案

根据您的意见,根据menuid属性获取所有子集合中存在的所有Food文档,a Firestore collection group query是需要的。该查询如下所示:

Query menuIdQuery = db.collectionGroup("Foods").whereEqualTo("menuid", yourMenuId);

关于java - Android Studio 中的 Firestore 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61366542/

相关文章:

java - 避免使用大量 Java 类共享字段的重复代码

android - 我们如何在按钮中显示进度图标

ios - 在 Xcode 中使用 SDK 登录 Facebook 时出现问题

java - 使用递归在二叉树中查找包含给定字符串的节点

java - 运行 fatjar 时无法加载 log4j2

java - 有没有办法通过 JMX 识别 CMS 并发模式故障?

android - NullPointerException 获取 StringArray 到 String[]

android - 无法使用 get 参数获取包的数据

javascript - Firebase beforeeach() 触发很多次(Vue 应用程序)

ios - gRPC-Core 1.14.0 和 1.14.1 的 pod 更新问题