android - 如何为同一用户在同一节点中添加多组值?
问题描述
我正在使用实时数据库。多个用户将提供相同的数据集,如 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:
快照2:
解决方案
为此,您可以简单地使用 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 中的结果将是上述引用下存在的每个孩子的“数量”。
如果您需要数字,最好将它们作为数字而不是字符串值存储在数据库中。
推荐阅读
- python - 如何只拆分列表的一个元素
- unity3d - 如何使用 Oculus 运动控制器传送到自定义点?
- c - 我看不懂inet/netinet/in.h 的宏
- amazon-web-services - Amazon S3/加速存储桶上传失败仅适用于慢速连接用户
- django - 用户自定义扩展 AbstractUser 未出现在“身份验证”管理面板中
- javascript - 挂起等待 s3.listObjects
- c++ - 取值后程序停止
- image - 在从 simulink 调用 loadMNISTImages 函数时无法使用“machineformat”输入参数
- java - 在持续时间内对课程学期的验证失败
- android - Google Play 结算中断购买:结算结果响应代码为 ITEM_ALREADY_OWNED