无法访问集合下的文档

Posted

技术标签:

【中文标题】无法访问集合下的文档【英文标题】:Unable to access document under the collection 【发布时间】:2021-10-12 08:40:02 【问题描述】:

在这种情况下,我尝试构建一个应用程序。因此,可以通过此应用访问两种类型的用户。那么我想要做的是,来自firestore中的集合的文档想要添加到片段中的recyclerview。在这个应用程序中,用户已注册,他可以请求请假,我想编码,如果用户发送请假请求,那么他可以从回收视图中看到他的请求,而不是其他人的请假请求。但这对我不起作用。 因此,如果您对这个问题有任何答案,请帮助我。 这是我的代码详细信息 java文件


public class status extends Fragment 

 View v;
    RecyclerView statusRecycleView;
   // ArrayList<Model> listModel;
    //RecyclerViewAdapterSt recyclerViewAdapterSt;
    FirebaseAuth auth = FirebaseAuth.getInstance();
    FirebaseUser FUser = auth.getCurrentUser();
    String UserId = FUser.getUid();
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    FirestoreRecyclerAdapter adapter;


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        // Inflate the layout for this fragment
        v = inflater.inflate(R.layout.fragment_status, container, false);
        statusRecycleView = v.findViewById(R.id.status_recyclerview);
        //listModel = new ArrayList<>();
       // recyclerViewAdapterSt = new RecyclerViewAdapterSt(listModel);
       // statusRecycleView.setAdapter(recyclerViewAdapterSt);
        statusRecycleView.setHasFixedSize(true);

        DocumentReference documentReference = db.collection("ApplyLeave").document(UserId).addSnapshotListener(new EventListener<DocumentSnapshot>() 
            @Override
            public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) 

            
        ;
        FirestoreRecyclerOptions<Model> options = new FirestoreRecyclerOptions.Builder<Model>()

        adapter = new FirestoreRecyclerAdapter<Model, status.myViewHolder>(options) 
                @NonNull
                @Override
                public status.myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
                    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_status,parent,false);
                    return new status.myViewHolder(v);
                
                @Override
                protected void onBindViewHolder(@NonNull status.myViewHolder holder, int position, @NonNull Model model) 
                    holder.h_reason.setText(model.getU_reason());
                    holder.h_name.setText(model.getU_nameL());
                    holder.h_selectLeave.setText(model.getU_select_leave());
                    holder.h_leaveType.setText(model.getU_leave_type());
                    holder.h_fromDate.setText(model.getU_from_date());
                    holder.h_toDate.setText(model.getU_to_date());
                
            ;
            statusRecycleView.setHasFixedSize(true);
            statusRecycleView.setLayoutManager(new LinearLayoutManager(getActivity()));
            statusRecycleView.setAdapter(adapter);



       /* db.collection("users").document(UserId).collection("Apply Leave").get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() 
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) 
                    List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
                     for(DocumentSnapshot d:list)
                          Model model = d.toObject(Model.class);
                         listModel.add(model);
                     
                     recyclerViewAdapterSt.notifyDataSetChanged();
                
             ).addOnFailureListener(new OnFailureListener() 
            @Override
            public void onFailure(@NonNull Exception e) 
                Log.d(TAG, "onFailure:" + e.toString());
            
        );*/

            return  v ;
        

        public static class myViewHolder  extends RecyclerView.ViewHolder
            TextView h_reason;
            TextView h_name;
            TextView h_selectLeave;
            TextView h_leaveType;
            TextView h_fromDate;
            TextView h_toDate;
            public myViewHolder( View itemView) 
                super(itemView);
            h_reason = itemView.findViewById(R.id.txt_reason_status);
            h_name = itemView.findViewById(R.id.txt_name_status);
            h_selectLeave = itemView.findViewById(R.id.txt_selectLeave_status);
            h_leaveType = itemView.findViewById(R.id.txt_leaveType_status);
            h_fromDate = itemView.findViewById(R.id.txt_fromDate_status);
            h_toDate = itemView.findViewById(R.id.txt_toDate_status);
        
        
    @Override
    public void onStart() 
        super.onStart();
        adapter.startListening();
    

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


    

这是 fragment_status.xml 文件



<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    tools:context=".status">

    <androidx.recyclerview.widget.RecyclerView
        android:layout_
        android:layout_
        android:scrollbarStyle="outsideOverlay"
        tools:listitem="@layout/item_status"
        android:scrollbars="vertical"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        android:id="@+id/status_recyclerview">

    </androidx.recyclerview.widget.RecyclerView>

所以我想知道,用户如何只能看到他们的请假请求而不是其他人? 这是我卡住的地方……从这里,所有的请求都显示给了用户。我想编写代码以仅显示用户对用户的请求。



        Query query_two = db.collection("applyLeave");
        FirestoreRecyclerOptions<Model_two> options_two = new FirestoreRecyclerOptions.Builder<Model_two>()
                .setQuery(query_two, Model_two.class)
                .build();

        adapter_two = new FirestoreRecyclerAdapter<Model_two, tmyViewHolder>(options_two) 
            @NonNull
            @Override
            public tmyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
                View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_status_admin, parent, false);
                return new tmyViewHolder(v);
            

这是我的 Firestore 详细信息....

所以你可以看到相同的 id 在那里突出显示。所以我需要的是,如果用户登录到应用程序,那么只有他的休假请求必须显示在 recycleview 中。你能帮帮我吗?

【问题讨论】:

这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗? 不,我也没有任何错误。但预期的是,当用户请求请假时,该请求的详细信息必须显示在另一个片段的回收视图中。 但在这种情况下,没有显示任何细节。非常特殊的情况,如果不仅您,而且其他用户都可以登录应用程序并请求离开。但只有您可以看到您的请求详情。 【参考方案1】:

使用Simple Queries。比如只获取用户名nirmal78的应用,

Query query_two = db.collection("applyLeave").whereEqualTo("u_nameL", "nirmal78");

确保您至少有一个对每个用户都是唯一的字段。

【讨论】:

感谢您的提交,但事实是,此代码适用于任何登录应用程序的用户。所以这不仅适用于 nirmal78。原来是这样......所以你有什么想法吗? 嗯,这取决于您如何存储和识别用户。理想情况下,您应该拥有每个用户唯一的 uid 或用户名,因此每当用户登录时,您将使用他们的 id/name 来让他们离开。【参考方案2】:

您似乎以用户的 UID 为用户命名了 applyLeave 文档。在这种情况下,您可以通过以下方式查询文档 ID:

Query query_two = db.collection("applyLeave")
   .whereEqualTo(FieldPath.documentId(), UserId)

由于文档 ID 在集合中是唯一的,因此这将最多匹配一个文档,然后将显示在您的视图中。


一般来说,您可能会为同一用户拥有多个applyLeave 文档,并且会将用户的UID 存储在文档中,而不是作为文档ID。在这种情况下,您可以通过以下方式查询 name 字段:

Query query_two = db.collection("applyLeave")
   .whereEqualTo("uid", UserId)

"uid" 是您存储 UID 的字段的名称。

【讨论】:

感谢您的提交,您的意思是“uid”是指字段名称“u_company_id”下的用户的给定 ID?我是对的,UserId 表示当前用户的 autogenaarte id 什么的?? UID 是 Firebase 身份验证中用户的 ID。【参考方案3】:

试试这个...它成功了,

db.collection("users").document(UserId).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() 
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) 
                if (task.isSuccessful()) 
                    if (task.getResult().exists()) 
                        usernameM = task.getResult().getString("u_name");
                        Log.d("..............", usernameM);
                    
                
            
        );

        Query query = db.collection("applyLeave").whereEqualTo("u_nameL",usernameM);
        FirestoreRecyclerOptions<Model> options= new FirestoreRecyclerOptions.Builder<Model>()
                .setQuery(query, Model.class)
                .build();

【讨论】:

以上是关于无法访问集合下的文档的主要内容,如果未能解决你的问题,请参考以下文章

firefox无法访问本机apache www目录下的index.php

嵌入表单集合错误:无法确定属性的访问类型

内网不同网段的电脑无法访问linux网站服务器下的网页?

无法从 Eloquent 集合中访问所需的属性

内存模式下的H2数据库无法被Console访问

苹果Mac 无法打开文档Word : 用户没有访问权限