java - 如何将数据推送到firebase?
问题描述
我知道如何将数据推送到 firebase 数据库,但我遇到了问题。让我先展示我的代码:
我的 java 类如下所示:
public void btn_continue(View view) {
final String str_c2c = c2c.getText().toString().trim();
final String str_amount = samount.getText().toString().trim();
if (!TextUtils.isEmpty(str_c2c) && str_amount != null){
lareview.setVisibility(View.VISIBLE);
lasend.setVisibility(View.GONE);
amount.setText(str_amount);
mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");
mDatabaseUsers.child(str_c2c).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
String u_name = dataSnapshot.child("name").getValue().toString();
target_name.setText(u_name);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
target_name.setText("Your target user was not found!");
target_name.setTextColor(Color.RED);
}
});
}
}
public void btn_confirm(View view) {
final String str_balance = balance.getText().toString().trim();
Double d_balance = Double.parseDouble(str_balance);
final String str_c2c = c2c.getText().toString().trim();
final String str_amount = samount.getText().toString().trim();
//change todouble
final Double d_samount = Double.parseDouble(str_amount);
if (!TextUtils.isEmpty(str_c2c) && str_amount != null){
if (d_samount>d_balance){
Toast.makeText(Transfer.this, "Amount cant be higher than your balance", Toast.LENGTH_LONG).show();
}else {
lareview.setVisibility(View.VISIBLE);
lasend.setVisibility(View.GONE);
mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users");
mDatabaseUsers.child(str_c2c).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
final String userID = auth.getCurrentUser().getUid();
final long PostTime = new Date().getTime();
String str_posttime = Long.toString(PostTime);
String u_name = dataSnapshot.child("name").getValue().toString();
String u_tagetbalance = dataSnapshot.child("balance").getValue().toString();
Double d_tagetbalance = Double.parseDouble(u_tagetbalance);
Double d_bala = Double.parseDouble(str_balance);
Double send_amount = d_samount + d_tagetbalance;
Double d_deduct = d_bala - d_samount;
target_name.setText(u_name);
amount.setText(str_amount);
//update sender data
mDatabaseUsers.child(userID).child("balance").setValue(d_deduct);
mDatabaseUsers.child(userID).child("transactions").push().child("trans").setValue(str_amount + " - " + str_posttime + " - " + "C2C" + " - " + "Sent");
//post data transfer
mDatabaseUsers.child(str_c2c).child("balance").setValue(send_amount);
//for user transactions list
mDatabaseUsers.child(str_c2c).child("transactions").push().child("trans").setValue(str_amount + " - " + str_posttime + " - " + "C2C" + " - " + "Received");
//confirm success
Toast.makeText(Transfer.this, "Sent successfully!", Toast.LENGTH_SHORT).show();
Intent sbs = new Intent(Transfer.this, MainActivity.class);
startActivity(sbs);
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
target_name.setText("Your target user was not found!");
target_name.setTextColor(Color.RED);
}
});
}
}else {
c2c.setError("C2C cant be empty!");
samount.setError("Enter amount!");
}
}
当我通过单击提交按钮发送数据时,我想为我发布的每一个数据创建一个唯一的 ID。在那个id里面有一个叫trans的孩子,
好的,数据实际上是发布到firebase,但我的问题是:当我推送数据时,在创建数据字段(id)时,它正在创建多个数据字段,每个字段都有其唯一的id。我的意思是:我的应用程序冻结并且数据不断发布,直到我关闭移动数据。我只想发布一个数据,但它正在发布无限数据。
解决方案
您正在收听mDatabaseUsers.child(str_c2c)
. 因此,每次在该位置写入数据时,onDataChange
都会调用您。
然后在此onDataChange
您在 下编写一个新的子节点mDatabaseUsers.child(str_c2c)
,以便再次触发侦听器。然后在onDataChange
你添加另一个子节点,这样再次触发监听器。这是一个无限循环,在您关闭应用程序之前它确实不会停止。
对此的快速解决方法是只读取一次值,方法是使用:
mDatabaseUsers.child(str_c2c).addListenerForSingleValueEvent(....
推荐阅读
- amazon-web-services - docker AWS SAM本地未连接到docker dynamodb
- python - 使用 langdetect 删除非英文文本
- amazon-web-services - 如何通过关系在 DynamoDB 中建模多对多?
- c - 如何在C中存储一堆字符串?
- c# - 引用我创建的 WCF 服务时出错
- spring-boot - Liquibase 中更改日志的生成不正确 - 没有函数匹配...您可能需要添加显式类型转换。(liquibase + spring.boot)
- tensorflow - 将自定义 yolo 权重转换为 tflite?
- reactjs - 使用 Firebase 和 React 的 useEffect 清理功能
- javascript - 如何使用 Joi 验证电子邮件
- mysql - MariaDB服务器版本上参数错误的SQL存储过程LIKE操作