如何在Firebase中基于ID更新其他用户余额?

时间:2019-07-29 16:32:02

标签: java android firebase firebase-realtime-database

我正在使用Firebase进行android studio项目,目前我已经完成了注册和登录,但是我的功能是将余额转移到另一个有余额的用户。

因此,我需要做的是找到将金额转移给其他用户后修改/更新余额内容(值)的方法。

但是我做过一些研究,他们说Firebase仅可以使用自己的用户帐户进行读/写。

假设我已经登录到user1,并且想要转移到user2。

谢谢。

-Users
      -AsjdnskkhdiioAndmmnekwas

         Name:"User1"

         email:"user1@hotmail.com"

         uid: "Adjshdkjwwnekwihwoi4kdnw4l2"

         age:20

         Balance:100

      -DdmkenklahaoinskaAnmdmls

         Name:"User2"

         email:"user2@hotmail.com"

         uid: "Cbdnaknekmmalsmdlen1qnio2"

         age:21

         Balance:100
-------------------------------------------------------------------
**how to become:**

 -Users
      -AsjdnskkhdiioAndmmnekwas

         Name:"User1"

         email:"user1@hotmail.com"

         uid: "Adjshdkjwwnekwihwoi4kdnw4l2"

         age:20

         Balance:50

      -DdmkenklahaoinskaAnmdmls

         Name:"User2"

         email:"user2@hotmail.com"

         uid: "Cbdnaknekmmalsmdlen1qnio2"

         age:21

         Balance:150

2 个答案:

答案 0 :(得分:1)

请记住,您是管理员(数据库中)所有用户的所有信息。 使用DatabaseReference setValue()方法来更新数据库中的信息,如下所示:

private DatabaseReference mDatabase;
mDatabase = FirebaseDatabase.getInstance().getReference();

String senderId = "sample_id_sender";
String receiverId = "sample_id_receiver";
mDatabase.child("users").child(senderId ).child("Balance").setValue(new_balance1);
mDatabase.child("users").child(receiverId).child("Balance").setValue(new_balance2);

如何知道接收者的ID ???这取决于您的情况,例如,您要向名称为“ User2”的用户发送1 $。您必须在数据库的用户列表中找到user2 id,我认为这些指南对您有帮助: https://firebase.google.com/docs/database/android/read-and-write https://firebase.google.com/docs/database/android/lists-of-data

答案 1 :(得分:0)

有趣的问题。我认为您可以结合使用修改后的数据模型,事务和服务器端安全规则来实现此目的。

逐步:

  1. 由于您需要知道两个用户的当前余额才能确定他们的新余额,因此您需要使用一笔交易。
  2. 您需要以某种方式存储实际的事务,否则服务器将无法验证写入。此处的最小信息为from UIDto UIDamount
  3. 在您的安全规则中,然后应修改整个交易中两个帐户之间的总余额不变。为此,您需要来自第2步的数据,否则您将不知道to帐户。
  4. 最后,在您的安全规则中,您需要验证余额可以减少的唯一帐户是当前用户是所有者的帐户。在规则中,诸如"balance": { ".validate": "data.child('uid').val() == auth.uid || newData.child('Balance').val() > data.child('Balance').val()" }

可伸缩性可能是一个问题,因为它正在修改多个子节点中的节点,这意味着事务遍及整个顶级分支。

另请参阅: