#c# #json #firebase #firebase-realtime-database #xamarin.forms
#c# #json #firebase #firebase-realtime-database #xamarin.forms
Вопрос:
Это мои первые вопросы о переполнении стека, поэтому я прошу прощения, если это отформатировано неправильно. Я пытался использовать Xamarin.Формирует совместно с базой данных firebase realtime, но не могу правильно получить данные. Я продолжаю получать следующее исключение.
(Я не могу понять, как связать локальный образ, поэтому вот сообщение об исключении):
Unhandled Exception:
Firebase.Database.FirebaseException: Exception occured while processing the request.
Url: https://MY_DATABASE_LINK/users/user_name1/.json
Request Data:
Response: {"age":"Age_Val1","fName":"First_Val1","lName":"Last_Val1"}
Я использую Xamarin с пакетом NuGet FirebaseDatabase.net и пытались следовать следующим руководствам и онлайн-вопросам:
https://forums.xamarin.com/discussion/80017/firebase-database-query
Я пробовал использовать оба метода, и выдается одно и то же исключение. Кажется, база данных отправляет мне обратно правильные данные в формате JSON, но мой код не может их десериализовать. Вот моя структура базы данных JSON и код, который я пытаюсь запустить —
FirebaseHelper.cs:
public class FirebaseHelper
{
FirebaseClient firebase = new FirebaseClient("https://MY_DATABASE_LINK.firebaseio.com/");
public async Task<List<Person>> GetAllPersons()
{
return (await firebase
.Child("users")
.Child("user_name1")
.OnceAsync<Person>()).Select(item => new Person
{
FName = item.Object.FName,
LName = item.Object.LName,
Age = item.Object.Age
}).ToList();
}
}
Person.cs:
public class Person
{
public string FName { get; set; }
public string LName { get; set; }
public string Age { get; set; }
}
JSON Database Structure:
{
"users" : {
"user_name1" : {
"age" : "Age_Val1",
"fName" : "First_Val1",
"lName" : "Last_Val1"
},
"user_name2" : {
"age" : "Age_Val2",
"fName" : "First_Val2",
"lName" : "Last_Val2"
},
"user_name3" : {
"age" : "Age_Val3",
"fName" : "First_Val3",
"lName" : "Last_Val3"
}
}
}
Alt code tested:
List<Person> list_users = new List<Person>();
string[] ss = new string[] { "it", "succeeded" };
var items = await firebase
.Child("users")
.OrderByKey()
.OnceAsync<Person>();
foreach (var item in items)
{
Person user = new Person
{
FName = item.Object.FName,
LName = item.Object.LName,
Age = item.Object.Age
};
list_users.Add(user);
}
return list_users;
Я ожидал, что асинхронная пустота извлечет все объекты / данные из объекта JSON ‘user_name1’ и назначит их каждому из переменных в ‘Person.cs’, а затем создаст единый список длины первого пользователя.
Я также сделал это только с дочерним элементом («пользователи»), и он вернул больший объект JSON, но все равно выдал исключение (ожидал бы список пользователей длиной 3)
Мне просто интересно, почему возникает это исключение? Или, если я пытаюсь неправильно прочитать и назначить данные, и если да, то как мне это сделать правильно?
Комментарии:
1. Привет! Добро пожаловать в stackoverflow! Не волнуйтесь, ваш вопрос отлично отформатирован и довольно хорошо настроен. Я не эксперт по firebase, но с сообщением об исключении «При обработке запроса произошло исключение». и «Url: MY_DATABASE_LINK/users/ user_name1 /.json » (в частности, часть «/.json» ) Я могу сказать, что вы запрашиваете свои данные неправильным способом / последовательностью.
2. Как вы вызываете этот метод в своей viewmodel? Можете ли вы отладить его с помощью точек останова, а затем посмотреть, что вы получаете?
3. Привет, Васиф, я использовал точки останова, и это не дало мне гораздо больше информации. Поскольку он находится в одном большом блоке, он выполняется и завершается сбоем в этом блоке. Кажется, что он никогда не вызывает мою функцию модели Person, поскольку она никогда не показывала точку останова в классе Person .
Ответ №1:
Из вашего Person.cs
:
public class Person
{
public string FName { get; set; }
public string LName { get; set; }
public string Age { get; set; }
}
Тогда FirebaseHelper.cs
, по крайней мере, должно быть так:
public class FirebaseHelper
{
FirebaseClient firebase = new FirebaseClient("https://MY_DATABASE_LINK.firebaseio.com/");
public async Task<List<Person>> GetAllPersons()
{
return (await firebase
.Child("<table_name>") // should only be your table name,here should be 'users'
.OnceAsync<Person>()).Select(item => new Person
{
FName = item.Object.FName,
LName = item.Object.LName,
Age = item.Object.Age
}).ToList();
}
}
Наконец, получите людей следующим образом:
FirebaseHelper firebaseHelper = new FirebaseHelper();
var allPersons = await firebaseHelper.GetAllPersons();
Если другая проблема, вы можете показать скриншот имя_таблицы базы данных firebase.