我试图将数据快照发送到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();
}因此,我所有的数据都被添加到数据库中,但是我的数据结构如下所示。
我需要知道的是,如何防止子"0“被放置在pushID和我要添加的三个键之间,从而使我的数据结构看起来像这样。
发布于 2019-04-16 03:26:42
就像在Gazihan's answer中提到的那样,问题产生于将一个列表(活动)上传到数据库,而不是您想要的节点(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.");
});
}发布于 2019-04-15 21:15:56
您正在用单个元素推送一个List。0表示它是第0元素。如果List中有更多的元素,您将看到1、2等。
你应该换掉这一行
mutableData.Value = Campaigns;用这条线
mutableData.Value = newCampaignMap;再试一次。
另外,你也可以摆脱那些不再使用的运动等等。
https://stackoverflow.com/questions/55696743
复制相似问题