簡體   English   中英

如何從 Xamarin-Android 中的 Firebase 實時數據庫中檢索單個記錄?

[英]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 數據庫文檔,您可以找到解釋您想要什么的過濾數據

為了滿足您的方案,您需要做的是:

  1. 根據 Email 對子元素進行排序,並使用 EuqalTo() 限制 output 數據范圍。

     var db = FirebaseDatabase.Instance; var mDatabase = db.GetReference("characters"); Query query = mDatabase.OrderByChild("Email").EqualTo("harry.potter@example.com");
  2. 創建一個 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) {} }
  3. 注冊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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM