首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止新数据快照创建附加子数据

防止新数据快照创建附加子数据
EN

Stack Overflow用户
提问于 2019-04-15 20:25:56
回答 2查看 27关注 0票数 0

我试图将数据快照发送到Firebase数据库。这主要是很好的工作,但我有一个问题,不是将子对象直接附加到其预期的父母,而是将它们添加到附加到预期父母的另一个子对象中。

代码语言:javascript
复制
public void CreateCampaign()
{
   campaignName = campaignNameText.text;
   ownerName = pInfo.userName;

   if (string.IsNullOrEmpty(campaignName))
   {
      DebugLog("invalid campaign name.");
      return;
   }

   DebugLog(String.Format("Attempting to add campaign ", campaignName, ownerName));

   DatabaseReference reference = FirebaseDatabase.DefaultInstance.GetReference("Users").Child(pInfo.userName).Child("Campaigns").Push();

   DebugLog("Running Transaction...");

   reference.RunTransaction(AddCampaignTransaction)
     .ContinueWith(task =>
   {
      if (task.Exception != null)
      {
         DebugLog(task.Exception.ToString());
      }
      else if (task.IsCompleted)
      {
         DebugLog("Campaign " + campaignName + " added successfully.");
      }
   });
}
代码语言:javascript
复制
TransactionResult AddCampaignTransaction(MutableData mutableData)
{
   List<object> Campaigns = mutableData.Value as List<object>;

   if (Campaigns == null)
   {
      Campaigns = new List<object>();
   }


   Dictionary<string, object> newCampaignMap = new Dictionary<string, object>();
   newCampaignMap["CampaignName"] = campaignName;
   newCampaignMap["Owner"] = pInfo.userName;
   newCampaignMap["Members"] = 0;
   Campaigns.Add(Child(newCampaignMap));

   mutableData.Value = Campaigns;

   return TransactionResult.Success(mutableData);

   InitializeCampaign();
}

因此,我所有的数据都被添加到数据库中,但是我的数据结构如下所示。

  • 用户
    • 用户名
      • 活动
        • pushID
          • 0
          • 竞选名称
          • 所有者名称
          • 模因

我需要知道的是,如何防止子"0“被放置在pushID和我要添加的三个键之间,从而使我的数据结构看起来像这样。

  • 用户
    • 用户名
      • 活动
        • pushID
          • 竞选名称
          • 所有者名称
          • 成员

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-16 03:26:42

就像在Gazihan's answer中提到的那样,问题产生于将一个列表(活动)上传到数据库,而不是您想要的节点(newCampaignMap)。

当您需要以有序的方式修改服务器上已经存在的数据时,将使用事务。由于您使用Push()来生成新的数据库引用,因此不需要这样做,可以使用SetValueAsync

在上面为AddCampaignTransaction编写的代码中,生成一个空列表(因为从来没有数据),将newCampaignMap的值添加到该列表中,然后将列表上传到数据库,而不仅仅是新的值。在这个函数中,您还使用了来自CreateCampaign函数的共享内部变量,这是一个错误的实践,特别是在处理异步代码时。

相反,我建议使用以下代码:

代码语言:javascript
复制
public void CreateCampaign()
{
    // take local copies of values
    string campaignName = campaignNameText.text;
    string ownerName = pInfo.userName;

    if (string.IsNullOrEmpty(campaignName))
    {
        DebugLog("invalid campaign name.");
        return;
    }

    DebugLog(String.Format("Attempting to add campaign '{0}' for '{1}'... ", campaignName, ownerName));

    // structure data
    Dictionary<string, object> newCampaignMap = new Dictionary<string, object>();
    newCampaignMap["CampaignName"] = campaignName;
    newCampaignMap["Owner"] = pInfo.userName;
    newCampaignMap["Members"] = 0;

    DebugLog("Adding to database... ");
    // get reference and upload data
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.GetReference("Users").Child(pInfo.userName).Child("Campaigns").Push();
    reference.SetValueAsync(newCampaignMap)
        .ContinueWith(task =>
    {
        if (task.IsFaulted)
        {
            DebugLog(task.Exception.ToString());
            return;
        }

        DebugLog("Campaign " + campaignName + " added successfully.");
    });
}
票数 0
EN

Stack Overflow用户

发布于 2019-04-15 21:15:56

您正在用单个元素推送一个List。0表示它是第0元素。如果List中有更多的元素,您将看到1、2等。

你应该换掉这一行

代码语言:javascript
复制
mutableData.Value = Campaigns;

用这条线

代码语言:javascript
复制
mutableData.Value = newCampaignMap;

再试一次。

另外,你也可以摆脱那些不再使用的运动等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55696743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档