C# 如何在Xamarin Android中从Firebase实时数据库检索单个记录?
我只需要从Firebase实时数据库中读取一个实体,并将结果转换为与结构匹配的C#类,但我还没有找到明确的解决方案。拥有这棵树: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"
{
"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数据库文档,您可以找到解释所需内容的
要满足您的场景,您需要做的是:
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)
{}
}
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();
}