Проблема
Ваша основная проблема в том, что Global.offers
является массивом и поэтому имеет фиксированную длину и не может быть динамически увеличена настолько просто (вам придется копировать массив каждый раз!)
Вы пытались решить эту проблему в Handle_ChildAdded
, но в строке
Global.offers = new Dictionary<string, object>[Global.storesCount+1];
на самом деле вы создаете новый пустой (!) Массив словарей длиной Global.storeCount+1
.Вы не копируете текущие значения в новый массив.
, поэтому после всех выполнений вы получаете массив только с null
.Только последний элемент массива будет иметь содержимое, поступающее из
Global.offers[Global.storeCount] = dict;
, поэтому фактически будет установлено только последнее значение.Это выглядит как
{null, null, null, null, ..., Dictionary<string, object> }
, поэтому длина является правильным значением.Ваше исключение фактически уже выброшено в тот момент, когда вы пытаетесь получить доступ к
Global.offers[0]
, то есть null
.
Solution
Я бы порекомендовал не использоватьмассив, но вместо этого List
, который, в отличие от массива, может динамически расти
[System.Serializable]
public class Global
{
public static List<Dictionary<string, object>> offers = new List<Dictionary<string, object>>();
}
, и, прежде чем начинать заполнять список, добавляя все словари, вы должны где-то вызвать
Global.offers.Clear();
для сброса списка, в противном случае он продолжает расти с каждой загрузкой базы данных.Также, если вы абсолютно уверены, что вызываете это только один раз, когда вам это может не понадобиться, я всегда рекомендую сделать это, чтобы получить чистое, в общем, рабочее решение.
И позже добавьте свои элементы в
void Handle_ChildAdded(object sender, ChildChangedEventArgs e)
{
if (e.DatabaseError != null)
{
Debug.LogError(e.DatabaseError.Message);
return;
}
// Do something with the data in args.Snapshot
if (e.Snapshot.Value != null)
{
var dict = e.Snapshot.Value as Dictionary<string, object>;
if (dict != null)
{
Debug.Log(dict);
Global.offers.Add(dict);
hasHaded = true;
}
}
}
Позже вы получите доступ к элементам в List
так же, как в массиве
Debug.Log(Global.offers[0]["Store"]);
Обратите внимание, что вам также не нужна переменная storeCount
ни в вашем решении - вы могли бы просто использовать
Global.offers.Length
, ни в этом новом решении - вы можете просто использовать
Global.offers.Count