Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Xamarin Android中从Firebase实时数据库检索单个记录?_C#_Performance_Xamarin_Firebase Realtime Database_Xamarin.forms - Fatal编程技术网

C# 如何在Xamarin Android中从Firebase实时数据库检索单个记录?

C# 如何在Xamarin Android中从Firebase实时数据库检索单个记录?,c#,performance,xamarin,firebase-realtime-database,xamarin.forms,C#,Performance,Xamarin,Firebase Realtime Database,Xamarin.forms,我只需要从Firebase实时数据库中读取一个实体,并将结果转换为与结构匹配的C#类,但我还没有找到明确的解决方案。拥有这棵树: { "characters" : { "c1" : { "Email" : "peter.pan@example.com", "LastName" : "Pan", "Name" : "Peter" }, "c2" : { "Email" : "harry.potter@example.com"

我只需要从Firebase实时数据库中读取一个实体,并将结果转换为与结构匹配的C#类,但我还没有找到明确的解决方案。拥有这棵树:

{
 "characters" : {
    "c1" : {
      "Email" : "peter.pan@example.com",
      "LastName" : "Pan",
      "Name" : "Peter"
    },
    "c2" : {
      "Email" : "harry.potter@example.com",
      "LastName" : "Potter",
      "Name" : "Harry"
    }
  }
}
而这个C级:

我只想通过电子邮件检索一条记录,我知道这是唯一的。但是,如果我包含NuGet包,则其中不存在方法或扩展方法,例如
OnceSingle()或OnceSingleAsync()

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.
Character=wait FirebaseDatabase.Instance
.GetReference(CharactersRoot)
.OrderByChild(“电子邮件”)
.EqualTo(“哈利。potter@example.com他一直工作到这里
.OnceSingleAsync()//此方法不可用。它不起作用。
另一方面,通过包含软件包(前者的升级版),支持
OnceSingleAsync()
,可以编写如下代码:

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...
FirebaseClient fbClient=新的FirebaseClient(Root);
var task=task.Run(异步()=>
{
返回等待fbClient.Child(CharactersRoot)
.OrderBy(“电子邮件”)
.EqualTo(“哈利。potter@example.com")
.OnceSingleAsync().ConfigureAwait(false)
});                 
var character=task.Result;
//做点有个性的事。。。
但它不起作用。它引发一个System.AggregateException:“发生了一个或多个错误。(响应状态代码不表示成功:400(错误请求)。”

下面是我唯一一个能够使它工作的方法,但它仍处于performant状态,因为它检索所有集合并在本地执行搜索

    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
            }
FirebaseClient fbClient=新的FirebaseClient(Root);
var task=task.Run(异步()=>
{
返回等待fbClient.Child(CharactersRoot)
.OnceAsync()
.配置等待(错误);
});
var character=task.Result
.Where(item=>item.Object.Email==”哈利。potter@example.com")
.Select(itm=>itm.Object)
.FirstOrDefault();
if(字符!=null)
{
//做点有个性的事
}
任何有助于澄清我的想法,使之更简单、更好的想法,我们都将不胜感激

我只想通过电子邮件检索一条记录,我知道这是唯一的

您正在寻找的是一种基于特定值(电子邮件)查询数据库的方法。 阅读Firebase数据库文档,您可以找到解释所需内容的

要满足您的场景,您需要做的是:

  • 根据电子邮件对子元素进行排序,并使用EuqalTo()限制输出数据范围

    var db = FirebaseDatabase.Instance;
    var mDatabase = db.GetReference("characters");
    Query query = mDatabase.OrderByChild("Email")
                           .EqualTo("harry.potter@example.com");
    
  • 创建子事件侦听器以检索筛选的数据

    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());
    
  • 公共异步任务GetAttendant(字符串电子邮件)
    {
    返回(等待火力基地)
    .儿童(“性格”)
    .OnceAsync())。选择(项=>新字符
    {
    EmailAddress=电子邮件,
    }).FirstOrDefault();
    }
    

    //希望这有帮助

    没人知道吗?我不够清楚?O只有我一个人想和Xamarin一起发展吗?请让我知道…欢迎来到堆栈溢出。没有任何解释的代码转储很少有帮助。堆栈溢出是关于学习,而不是提供盲目复制和粘贴的代码片段。请回答您的问题,并解释它如何比OP提供的更好地工作。
    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();
        }