首页 > 解决方案 > 如何为同一用户在同一节点中添加多组值?

问题描述

我正在使用实时数据库。多个用户将提供相同的数据集,如 Snapshot1 所示。每当同一用户提交其他数据集时,它都会更新旧记录,但我想添加新记录,就像单个用户可以保存多组数据一样,如 Snapshot2。

我的代码是:

   Contribution cont = new Contribution(money, month, payment, date, tref, rem);
        FirebaseDatabase.getInstance().getReference("Contribution")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                .setValue(cont).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(ContributionDeclarationForm.this, "Successfully Submitted", Toast.LENGTH_LONG).show();
                    Intent intent = new Intent(ContributionDeclarationForm.this, DashboardActivity.class);
                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(ContributionDeclarationForm.this, "Not Submitted", Toast.LENGTH_LONG).show();
            }
        });

提前致谢。

快照1:

快照1

快照2:

快照2

标签: androidfirebasefirebase-realtime-database

解决方案


为此,您可以简单地使用 DatabaseReference 的push()方法,该方法:

创建对自动生成的子位置的引用。

所以像:

FirebaseDatabase.getInstance().getReference("Contribution")
        .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
        .push().setValue(cont).addOnCompleteListener(new OnCompleteListener<Void>() {
    ...

这意味着您将在 (Contribution/$uid) 下为每个孩子获得一个唯一的密钥。因此,您的新架构将如下所示:

Firebase-root
  |
  --- Contribution
        |
        --- $uid
             |
             --- $pushedId
                    |
                    --- Amount: "369"
                    |
                    --- Contribution_Month: "5-2025"
                    |
                    --- //Other properties

如果要获取单个用户的所有子项,则需要使用指向 UID 的引用并循环遍历结果,如下面的代码行所示:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Contribution").child(uid);
uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                String amount = task.getResult().child("Amount").getValue(String.class);
                Log.d("TAG", amount);
            }
        } else {
            Log.d(TAG, task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

logcat 中的结果将是上述引用下存在的每个孩子的“数量”。

如果您需要数字,最好将它们作为数字而不是字符串值存储在数据库中。


推荐阅读