Firebase - 组特定类型的数据并在新表中存储为单个

时间:2017-03-12 17:55:47

标签: android firebase firebase-realtime-database firebase-storage

我的Firebase数据库

应用程序中的表格结构如下
alleTouren = alleTouren.sorted(by: { $0.compare($1, options:.numeric) == .orderedAscending} )

存储数据如下:

"storePurchase":{
         "$user_id":{
             ".read": "$user_id===auth.uid",
             ".write":"$user_id===auth.uid",
             "$storeId":{
                   ".validate":"root.child('stores/'+auth.uid+'/'+$storeId).exists()",
                   "$pId":{
                       "cId":{
                           ".validate":"root.child('customers/'+auth.uid+'/'+newData.val()).exists()",
                       },
                       "amount":{

                       },
                       "rate":{

                       },
                   }
             }  
        }
 },

我有{ "-KeyN0kMSGZbb9hb9lNm" : { "-Kf2_5kJoLctmlGcR4d1" : { "amount" : "2500", "cid" : "-KdChbdoV7nxwZoGLWsY", //cust1 "rate" : "5" }, "-Kf2_e05toGelnjRMbfg" : { "amount" : "10000", "cid" : "-KdCggxld52mq0DsGRjH", //cust2 "rate" : "0.5" }, "-Kf2auWq_hQtTErp55SY" : { "amount" : "5869", "cid" : "-KdChbdoV7nxwZoGLWsY", //cust1 "rate" : "58" }, "-Kf2b1QoF4I7LAVAL0_4" : { "amount" : "25000", "cid" : "-KdChbdoV7nxwZoGLWsY", //cust1 "rate" : "0.8" }, "-Kf2bEwN5PtwGUec_UFh" : { "amount" : "2500", "cid" : "-KdCggxld52mq0DsGRjH", //cust2 "rate" : "0.8" }, "-Kf2b_tZo3rVJbegZNXa" : { "amount" : "5000", "cid" : "-KdCgJKh6_Rb8MOi-fIj", //cust3 "rate" : "1.5" } } } 即客户ID,现在我希望将每个客户的这些数据合并,并将其作为唯一值存储在单独的表中。我怎么能结合这些数据?我尝试过使用for循环并尝试将这些值存储在cId到一个单独的列表中,但是无法成功?我还能如何根据addValueEventListener合并这些数据并总结cId

修改

我试图实现以下数据结构。

amount

1 个答案:

答案 0 :(得分:1)

每次购买时都要运行此交易,这样可以使您的理货簿按照您希望的方式更新。因此,每次将购买推送到Firebase时都要运行此事务。

dbRef.child("tallyBook/"+FirebaseAuth‌​.getInstance().getCu‌​rrentUser().getUid()‌+"/"+storeId+"/"+purchase1.cid).runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData mutableData) {
        TallyBook tally = mutableData.getValue(TallyBook.class);
        if (tally == null) {
            tally = new TallyBook();
            tally.totalRate = purchase1.rate;
            tally.totalAmount = purchase1.amount;
        } else {
            tally.totalRate = String.valueOf(Double.parseDouble(tally.totalRate) + Double.parseDouble(purchase1.rate));
            tally.totalAmount = String.valueOf(Double.parseDouble(tally.totalAmount) + Double.parseDouble(purchase1.amount));
        }
        mutableData.setValue(tally);
        return Transaction.success(mutableData);
    }

    @Override
    public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {}
    });
}

购买

public class Purchase {
    public String rate;
    public String cid;
    public String amount;

    public Purchase() {

    }
}

和TallyBook

public class TallyBook {
    public String totalRate;
    public String totalAmount;

    public TallyBook() {

    }
}

然后,您可以使用以下查询来获取特定用户和商店的理货簿。

dbRef.child("tallyBook/"+FirebaseAuth‌​.getInstance().getCu‌​rrentUser().getUid()‌+"/"+storeId).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot tally : dataSnapshot.getChildren()) {
            // I called this TallyBook but it's more like one entry in a tallybook
            TallyBook tally = tally.getValue(TallyBook.class);
            // Do something with tally, display it or whatever
        }
    }
    @Override
    public void onCancelled(DatabaseError databaseError) {
    }
});