问题描述
确切地说,如何使用用户ID作为集合名称在单独的集合中为每个用户添加数据,以防止所有人看到数据?我在一个项目中工作,用户在其中保存各自的数据并保存。保存数据后,数据将保存在Firebase中我创建的集合中。我的问题是,保存的数据存储在集合中,所有其他用户(包括不同用户)保存的全部数据都显示给每个用户。我正在寻找可以显示特定用户保存的数据(以我的情况而言,在recyclerview中),而不是显示存储在集合中的所有其他数据。
我相信这是通过为每个用户创建一个单独的集合来实现的,我不知道这些用户的实现
我希望可以共享许多Java文件,因为我不想让它变得凌乱而冗长,我只是发布了一个片段类,在其中从Firebase中检索数据。如果您需要任何其他文件,我希望与您分享。感谢您的阅读!
package com.cksapp.memoryin;
package com.cksapp.memoryin;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.linearlayoutmanager;
import androidx.recyclerview.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
/**
* A simple {@link Fragment} subclass.
*/
public class Third extends Fragment {
View v;
private RecyclerView mRecyclerview;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference noteref = db.collection("Notebook");
private Adapterrrr adapterrrr;
public Third() {
// required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
// Inflate the layout for this fragment
v = inflater.inflate(R.layout.fragment_third,container,false);
mRecyclerview = (RecyclerView) v.findViewById(R.id.recycler_view_interest);
setuprecyclerview();
return v;
}
private void setuprecyclerview() {
Query query = db.collection("Notebook");
FirestoreRecyclerOptions<CardModel> options = new FirestoreRecyclerOptions.Builder<CardModel>()
.setQuery(query,CardModel.class)
.build();
adapterrrr = new Adapterrrr(options);
mRecyclerview = (RecyclerView) v.findViewById(R.id.recycler_view_interest);
//mRecyclerview.setHasFixedSize(true);
mRecyclerview.setLayoutManager(new linearlayoutmanager(getContext()));
mRecyclerview.setAdapter(adapterrrr);
}
@Override
public void onStart() {
super.onStart();
adapterrrr.startListening();
}
@Override
public void onStop() {
super.onStop();
adapterrrr.stopListening();
}
}
我现在有3个用户,这三个用户都可以访问存储在Firebase中的数据。因此,从技术上讲,数据是由在我的应用中注册的每个用户添加和访问的。我想保存数据并专门针对保存的每个用户进行检索。
因此,在我的情况下,无论谁添加了数据,所有用户都可以访问recyclerview中的数据,这些数据是所有用户共有的。如何使其数据特定于用户?
解决方法
最常见的方法是创建一个名为owner
的字段,该字段将在每个文档中具有User UID
的值:
/Notebooks/{notebook_id}
{
name: "a",amount: "2",owner: "user_uid"
}
并将您的查询更改为:
var user = firebase.auth().currentUser;
Query query = db.collection("Notebook").where("owner","==",user.uid).get();
此外,建议添加安全规则,以避免未经身份验证的用户进行读取和写入:
service cloud.firestore {
match /databases/{database}/documents {
match /Notebooks/{notebook_id} {
allow read,write: if request.auth != null && request.auth.uid == resource.data.owner;
}
}
}
您可以在此处找到有关如何通过特定用户ID保护文档的更多信息:Secure and query documents based on auth.uid
,感谢您抽出宝贵时间阅读我的帖子。我能够找出解决方案。我已经更改了有关身份验证用户ID的查询,并为用户ID生成了一个子集合类。
因此,层次结构如下
- 主要收藏。 笔记本
- 用户ID 用户ID
- userHourbook (新收藏集)
以及我的查询代码中的更改 只是层次结构的表示形式
Query query = db.collection("Hourbook").document(user.getUid()).collection("userHourbook");