[英]How to retrieve a single record from Firebase Real Time Database in Xamarin-Android?
我只需要從 Firebase 實時數據庫中讀取一個實體並將結果轉換為 C# class 匹配結構,但我還沒有找到明確的解決方案。 擁有這棵樹:
{
"characters" : {
"c1" : {
"Email" : "peter.pan@example.com",
"LastName" : "Pan",
"Name" : "Peter"
},
"c2" : {
"Email" : "harry.potter@example.com",
"LastName" : "Potter",
"Name" : "Harry"
}
}
}
而這個 C# class:
public class Character
{
public string Email {get; set; }
public string Name { get; set; }
public string LastName { get; set; }
}
我只想檢索 email 的一條記錄,我知道它是獨一無二的。 But, if I do include the NuGet package Xamarin.Firebase.Database there not exists a method or extension method such as OnceSingle<T>() or OnceSingleAsync<T>()
in it:
Character character = await FirebaseDatabase.Instance
.GetReference(CharactersRoot)
.OrderByChild("Email")
.EqualTo("harry.potter@example.com") //Works until here
.OnceSingleAsync<Character>(); //THIS METHOD IS NOT AVAILABLE. It doesn't work.
In the other hand, by including package Xamarin.Forms.FirebaseWrapper , an upgrade of the former Firebase.Xamarin , that supports OnceSingleAsync<T>()
one can code something like this:
FirebaseClient fbClient= new FirebaseClient(Root);
var task = Task<Character>.Run(async () =>
{
return await fbClient.Child(CharactersRoot)
.OrderBy("Email")
.EqualTo("harry.potter@example.com")
.OnceSingleAsync<Character>().ConfigureAwait(false)
});
var character = task.Result;
// do something with character...
但它不起作用。 它引發了System.AggregateException:'發生了一個或多個錯誤。 (響應狀態碼不表示成功:400(錯誤請求)。)'
以下是我設法使其工作的唯一方法,但它性能不佳,因為它檢索所有集合並在本地執行搜索。
FirebaseClient fbClient= new FirebaseClient(Root);
var task = Task<Character>.Run(async () =>
{
return await fbClient.Child(CharactersRoot)
.OnceAsync<Character>()
.ConfigureAwait(false);
});
var character = task.Result
.Where(item => item.Object.Email == "harry.potter@example.com")
.Select(itm => itm.Object)
.FirstOrDefault();
if (character != null)
{
//Do something with character
}
任何可以幫助我理清思路以使其更簡單,更好的想法將不勝感激。
我只想檢索 email 的一條記錄,我知道它是獨一無二的。
您正在尋找的是一種基於特定值(電子郵件)查詢數據庫的方法。 通讀 Firebase 數據庫文檔,您可以找到解釋您想要什么的過濾數據。
為了滿足您的方案,您需要做的是:
根據 Email 對子元素進行排序,並使用 EuqalTo() 限制 output 數據范圍。
var db = FirebaseDatabase.Instance; var mDatabase = db.GetReference("characters"); Query query = mDatabase.OrderByChild("Email").EqualTo("harry.potter@example.com");
創建一個 Child 事件偵聽器以檢索過濾后的數據。
public class MyChildEventListener: Java.Lang.Object, IChildEventListener { public void OnCancelled(DatabaseError error) {} public void OnChildAdded(DataSnapshot snapshot, string previousChildName) { //this method will be triggered //snapshot's key is c2 namly harry potter } public void OnChildChanged(DataSnapshot snapshot, string previousChildName) {} public void OnChildMoved(DataSnapshot snapshot, string previousChildName) {} public void OnChildRemoved(DataSnapshot snapshot) {} }
注冊MyChildEventListener
:
query.AddChildEventListener(new MyChildEventListener());
public async Task<Character> GetAttendant(string email)
{
return (await firebase
.Child("Character")
.OnceAsync<Character>()).Select(item => new Character
{
EmailAddress = email,
}).FirstOrDefault();
}
//希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.