【问题标题】:How to get document ID for adding collection to it - android studio firestore如何获取文档 ID 以向其中添加集合 - android studio firestore
【发布时间】:2021-05-13 23:47:14
【问题描述】:

我正在开发食谱应用程序,以便用户可以注册到应用程序并保存自己的食谱。 我已经创建了食谱类,现在我想将食谱的集合添加到特定用户,使用他的 UID,但我不知道如何检索路径 ID 以插入集合。

This is the image of the hierarchy of the firestore

请帮忙...我写的代码:

public class AddRecipe extends AppCompatActivity {

    private FirebaseFirestore db;
    private FirebaseAuth mAuth;
    private CollectionReference usersRef;
    private FirebaseUser user;
    DocumentReference docRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        db = FirebaseFirestore.getInstance();
        mAuth = FirebaseAuth.getInstance();
        usersRef = db.collection("Users");


        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_recipe);
    }


    public void addRecipeFunc(View view) {

        user = mAuth.getCurrentUser();
        String uid = user.getUid();
        HashMap<String, String> ingredients = new HashMap<>();
        ingredients.put("Banana", "3");
        Recipe recipe = new Recipe("bla", "bla", ingredients, "bla", "bla", "bla");

        usersRef = db.collection("Users");
        //usersRef.document(uid).collection("Recipes").add(recipe);
        db.collection("Users").document(uid).collection("Recipes").document("Recipe").set(recipe);
    }
}

【问题讨论】:

    标签: android google-cloud-firestore collections document


    【解决方案1】:
    db.collection("Users").document(uid).collection("Recipes").document("Recipe").set(recipe);
    

    该代码会将Recipe 添加到Recipe 集合中,并带有一个名为Recipe 的文档。这意味着每次用户想要添加新配方时,它都会覆盖配方文档。如果您不给文档命名,Firestore 将创建文档并自己给出一个 id。

    db.collection("Users").document(uid).collection("Recipes").document().set(recipe);
    

    您可以通过使用 DocumentReference 调用的 getId() 方法获取 DocumentId。

    DocumentReference ref =  db.collection("Users").document(uid).collection("Recipes").document();
    //Id of the document
    String docId = ref.getId();
    ref.set(recipe);
    

    或者您可以将另一个名为 Id 的字段添加到您的 Recipe 类中(不要忘记将该字段添加到构造函数中),然后您可以设置自己的 Id。这也会将您的 ID 保存到文档中。

    String id = String.valueOf(System.currentTimeMillis());
    Recipe recipe = new Recipe(id, "bla", "bla", ingredients, "bla", "bla", "bla");
    DocumentReference ref =  db.collection("Users").document(uid).collection("Recipes").document(id).set(recipe);
    

    编辑: 如果您想在用户文档中添加所有 Recipe 对象而不创建子集合,请创建 Map 并将所有配方存储在其中。

    Map<String, Recipe> recipes = new HashMap<>;
    recipes.put("recipe1", new Recipe("bla", "bla", ingredients, "bla", "bla", "bla"));
    recipes.put("recipe2", new Recipe("bla2", "bla2", ingredients2, "bla2", "bla2", "bla2"));
    

    并使用您的地图更新该文档。 field 是 Map 的字段名(用户的文档需要 Map 的字段)。

    DocumentReference ref =  db.collection("Users").document(uid);
    db.runTransaction((Transaction.Function<String>) transaction -> {
        transaction.update(ref, field, recipes);
        return null;
    });
    

    【讨论】:

    • 首先,感谢您的评论!我的意思是我想将集合“食谱”添加到用户字段中的特定文档 - 这意味着我想知道,在运行时,我应该将食谱插入到哪个用户文档路径......希望它更清楚
    • db.collection("Users").document(uid) 是当前用户的文档。如果在该文档之后添加 .collection("Recipes"),“Recipes”集合将添加到当前用户的文档下。所以它会是用户->当前用户ID->食谱。之后,其他食谱文档将添加 Under Recipes 集合。用户->currentUserID->Recipes->recipeID。因此,每个用户都将拥有自己的带有食谱文档的食谱集合。或者您可以创建一个包含用户所有食谱对象的地图,并将其作为字段存储在当前用户的文档中。
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 2019-09-24
    • 2018-04-04
    • 2020-01-12
    • 1970-01-01
    • 2021-07-17
    • 2020-12-04
    • 2019-02-27
    相关资源
    最近更新 更多