无法访问集合下的文档
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();
【讨论】:
以上是关于无法访问集合下的文档的主要内容,如果未能解决你的问题,请参考以下文章