предотвращение создания дополнительного снимка новых данных - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь отправить снимки данных в базу данных Firebase.Это в основном работает нормально, но у меня возникает проблема, когда вместо дочерних объектов, прикрепляемых непосредственно к их предполагаемым родителям, они добавляются к дополнительному дочернему объекту, который прикреплен к предполагаемому родителю.

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.");
      }
   });
}
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 и тремя добавляемыми мной ключами, чтобы моя структура данных выглядела следующим образом.

  • Users
    • Имя пользователя
      • Кампании
        • pushID
          • Имя кампании
          • Имя владельца
          • Участники

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Как упоминалось в ответ Газихана , проблема возникает из-за загрузки списка (Campaigns) в базу данных, а не в нужный вам узел (newCampaignMap).

Транзакции используются там, где вам нужно упорядоченно изменить данные, которые уже существуют на сервере. Поскольку вы используете Push() для создания новой ссылки на базу данных, в этом нет необходимости, и вместо нее можно использовать SetValueAsync.

В своем коде для AddCampaignTransaction выше вы генерируете пустой список (потому что данных никогда не существует), добавляете значение newCampaignMap в этот список и затем загружаете список в базу данных вместо просто нового значения , В этой функции вы также используете общие внутренние переменные из функции CreateCampaign, что является плохой практикой, особенно при работе с асинхронным кодом.

Вместо этого я предлагаю использовать следующий код:

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 голосов
/ 16 апреля 2019

Вы нажимаете List с одним элементом.0 означает, что это 0-й элемент.Если бы в List было больше элементов, вы бы увидели 1, 2 и т. Д.

Вы должны заменить эту строку

mutableData.Value = Campaigns;

этой строкой

mutableData.Value = newCampaignMap;

и попробуйте еще раз.

Также вы можете избавиться от кампаний и т. Д., Которые больше не используются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...