如何使用用户ID作为集合名称在单独的集合中为每个用户在firebase中添加数据?

问题描述

确切地说,如何使用用户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();
    }
}

Screenshot of my firebase

我现在有3个用户,这三个用户都可以访问存储在Firebase中的数据。因此,从技术上讲,数据是由在我的应用中注册的每个用户添加和访问的。我想保存数据并专门针对保存的每个用户进行检索。

users

因此,在我的情况下,无论谁添加了数据,所有用户都可以访问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生成了一个子集合类。

因此,层次结构如下

  1. 主要收藏。 笔记本
  2. 用户ID 用户ID
  3. userHourbook (新收藏集)

以及我的查询代码中的更改 只是层次结构的表示形式

Query query = db.collection("Hourbook").document(user.getUid()).collection("userHourbook");