如何使用FirebaseDatabase.Net在实时数据库中创建电子邮件密钥

问题描述 投票:0回答:1

我想创建用户电子邮件密钥,而不是自动生成的密钥。我之所以要这样做,是因为能够查询该特定电子邮件并获取该用户数据,而不是从不方便的“用户”子数据中获取所有用户,尤其是如果用户数量会增加的话。

我正在使用FirebaseDatabase.Net,可以将其作为小部件使用。它是Firebase Realtime Database REST API的包装。

新用户将使用自动生成的密钥添加到实时数据库中,如下所示。如果这些键是用户电子邮件,也许我可以查询用户电子邮件并获取特定的电子邮件子数据,例如下面的代码:

         await firebase
              .Child("Users")
              .Child("[email protected]")
              .OnceSingleAsync<User>());

enter image description here

我使用示例示例中的代码。下面的功能是获取所有用户,添加新用途并获取用户。

        public FirebaseClient firebase = new FirebaseClient("firebaseurl");

        public async Task<List<User>> GetAllUsers()
        {
            return (await firebase
                  .Child("Users")
                  .OnceAsync<User>()).Select(item => new User
                  {
                      Firstname = item.Object.Firstname,
                      Lastname = item.Object.Lastname,
                      Username = item.Object.Username,
                      Email = item.Object.Email,
                      Password = item.Object.Password,
                  }).ToList();
        }

        public async Task<User> GetUser(string email)
        {
            var AllUsers = await GetAllUsers();
            await firebase
              .Child("Users")
              .OnceAsync<User>();
            return AllUsers.Where(a => a.Email == email).FirstOrDefault();
        }

        public async Task<bool> AddUser(User newUser)
        {
            try
            {
                await firebase
                  .Child("Users")
                  .PostAsync(newUser);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error:{e}");
                return false;
            }
        }

[请指导我创建电子邮件密钥而不是自动生成的密钥,以便我可以使用电子邮件密钥而不是获取所有用户来请求特定的用户数据。

c# firebase firebase-realtime-database xamarin.forms
1个回答
0
投票

我热切地等待一个答案,刷新页面了很多次。幸运的是,我找到了一种方法。

[创建电子邮件密钥],首先替换电子邮件字符串中的任何字符,例如“。$#[]”,因为Firebase不支持它们。或另一种方式是将字符串转换为字节数组,然后转换为base64。好消息是base64字符串字母没有这些字符,因此可以安全地使用它。

Base64 Alphabet

然后在AddUser函数中,将base64电子邮件密钥子项放在主子项“ User2”下。主要孩子可以是任何名字,此后我将对其进行更改。 “ PutAsync”会将新的用户数据放入该电子邮件子级。请注意,“用户”是我定义的类,具有用户属性,例如名字,姓氏,电子邮件,国家/地区,电话等。

public async Task<bool> AddUser(User newUser)
        {
            try
            {
                string userEmail = Convert.ToBase64String(Encoding.ASCII.GetBytes(newUser.Email));

                await firebase
                  .Child("User2")
                  .Child(userEmail)
                  .PutAsync(newUser);

                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error:{e}");
                return false;
            }
        }

而且有效!在下图中,旧的“ Users”子级具有自动生成的密钥,而新的“ User2”子级具有base64电子邮件密钥。不用担心,可以通过GetUser函数轻松获得它。

enter image description here

在GetUser函数中,电子邮件将以与AddUser函数相同的方式转换为base64。如果“ User2”子代中存在base64电子邮件密钥子代,则返回用户数据。

public async Task<User> GetUser(string email)
        {
            try
            {
                string userEmail = Convert.ToBase64String(Encoding.ASCII.GetBytes(email));

                return (await firebase
                  .Child("User2")
                  .Child(userEmail)
                  .OnceSingleAsync<User>());
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error:{e}");
                return null;
            }
        }

我希望这个答案有用。如果它对您有所帮助,请竖起大拇指的答案,我将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.