java—将increment childname添加到firebase,然后向其中添加数组

u3r8eeie  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(316)

除了我前面的问题:firebase事务返回arraylist处理
我仍然无法添加具有增量id的子节点,我已经尝试使用本文中的解决方案:firebase中的android studio value increment
我最大的努力是:

mDatabase.child("history").child(user.getUid()).runTransaction(new Transaction.Handler() {
  @NonNull
  @Override
  public Transaction.Result doTransaction(@NonNull MutableData mutableData) {
      Log.i("HISTORY", "List length: "+ mutableData.getKey());
      long value = 0;
      if(mutableData.getKey() != null) {
            String numRecords = (String) mutableData.getKey();
            value = Long.parseLong(numRecords, 16);
      }
      value++;
      incHex = Long.toHexString(value);
      mutableData.setValue(incHex);
      return Transaction.success(mutableData);
  }
  @Override
  public void onComplete(@Nullable DatabaseError error, boolean committed, @Nullable DataSnapshot currentData) {
       Log.i("HISTORY", "List length: "+ currentData.getKey());
       mDatabase.child("history").child(user.getUid()).child(incHex).setValue(planHistory);
  }
});

但它只是更新子id 1的值,而不是添加子id 2并为其添加值。
如何添加增量子id并在其上放置数组?
编辑:这是json树:

"history" : {
"CgLSsYAk2Tel8A8FSPLA5rBH8ZG2" : [ null, {
  "date" : "16-Dec-2020",
  "level_name" : "Body Builder",
  "personal_trainer_id" : "aHb1vJ8JmBTuO7TArx4ehVeDbJJ2",
  "plan_key" : "Plan6",
  "plan_name" : "Perfect Abdominal Muscles ",
  "type_name" : "Abs",
  "uri" : "https://firebasestorage.googleapis.com/v0/b/zahfit-s-mobile-app.appspot.com/o/exercise_plan%2Fmotiontoburn.jpg?alt=media&token=bd5ebb02-f9fb-48bf-880f-a1724c5b38ee"
} ]
 },
eufgjt7s

eufgjt7s1#

当您在某个位置运行事务时,您将获得该位置的所有数据,并且必须告诉数据库在写操作之后该位置需要存在的所有数据。
自从你读了 /history/$uid ,您将从该位置获取所有数据,并且需要确保 MutableData 返回包含的所有数据 /history/$uid 我也是。通过呼叫 mutableData.setValue(incHex) ,你在告诉数据库替换当前存在于 /history/$uid 使用新的增量值。
更可能的情况是,你会想做如下事情:

mutableData.child(incHex).setValue("the value or `Map` for the new location");
0aydgbwb

0aydgbwb2#

感谢@frank van puffelen的建议,我没有使用事务,而是使用firebase内置的push()函数。

public void onClick(View view) {
    Date c = Calendar.getInstance().getTime();
    SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy", Locale.getDefault());
    String formattedDate = df.format(c);
    mDatabase.child("history").child(user.getUid()).push().setValue(new PlanHistory(formattedDate, plan.getPlan_key(), plan.getPlan_name(), plan.getLevel_name(), plan.getType_name(), plan.getPersonal_trainer_id(), plan.getUri()));
}

虽然不是递增值而是生成的按键,但它仍然满足了我的需求。
使用push()的json树:

"history" : {
"CgLSsYAk2Tel8A8FSPLA5rBH8ZG2" : {
  "-MOdgaP_SBTQ2xXmn6au" : {
    "date" : "16-Dec-2020",
    "level_name" : "Easy",
    "personal_trainer_id" : "aHb1vJ8JmBTuO7TArx4ehVeDbJJ2",
    "plan_key" : "Plan3",
    "plan_name" : "Abs Fat Reduction",
    "type_name" : "Abs",
    "uri" : "https://firebasestorage.googleapis.com/v0/b/zahfit-s-mobile-app.appspot.com/o/exercise_plan%2Fmotiontoburn.jpg?alt=media&token=bd5ebb02-f9fb-48bf-880f-a1724c5b38ee"
  },
  "-MOdgbpKBfFxjpPVR2JD" : {
    "date" : "16-Dec-2020",
    "level_name" : "Medium",
    "personal_trainer_id" : "aHb1vJ8JmBTuO7TArx4ehVeDbJJ2",
    "plan_key" : "Plan9",
    "plan_name" : "Form the Abdominal Muscle",
    "type_name" : "Abs",
    "uri" : "https://firebasestorage.googleapis.com/v0/b/zahfit-s-mobile-app.appspot.com/o/exercise_plan%2Fmotiontoburn.jpg?alt=media&token=bd5ebb02-f9fb-48bf-880f-a1724c5b38ee"
  },
  "-MOdgmYMUIIZo0hasON_" : {
    "date" : "16-Dec-2020",
    "level_name" : "Body Builder",
    "personal_trainer_id" : "aHb1vJ8JmBTuO7TArx4ehVeDbJJ2",
    "plan_key" : "Plan4",
    "plan_name" : "Hercules Excercise",
    "type_name" : "Full body",
    "uri" : "https://firebasestorage.googleapis.com/v0/b/zahfit-s-mobile-app.appspot.com/o/exercise_plan%2Fmotiontoburn.jpg?alt=media&token=bd5ebb02-f9fb-48bf-880f-a1724c5b38ee"
  }
}

},

相关问题