【问题标题】:How to create email key in Realtime Database using FirebaseDatabase.Net如何使用 FirebaseDatabase.Net 在实时数据库中创建电子邮件密钥
【发布时间】:2020-03-18 06:51:38
【问题描述】:

我想创建用户电子邮件密钥,而不是自动生成的密钥。我想这样做的原因是能够查询该特定电子邮件并获取该用户数据,而不是从不方便的“用户”子数据中获取所有用户,尤其是在用户数量增加的情况下。

我正在使用FirebaseDatabase.Net,它可以作为 nuget 使用。它是 Firebase 实时数据库 REST API 之上的包装器。

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

         await firebase
              .Child("Users")
              .Child("user1@email.com")
              .OnceSingleAsync<User>());

我正在使用示例示例中的代码。下面的函数分别是获取所有用户、添加新用途和获取用户。

        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】:

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

    要创建电子邮件密钥,请先替换电子邮件字符串中的任何字符,例如 ". $ # [ ]",因为 Firebase 不会支持他们。或者另一种方式是将字符串转换为字节数组,然后转换为base64。好在base64字符串字母表没有这些字符,所以使用起来很安全。

    然后在 AddUser 函数中,将 base64 电子邮件密钥子项放在主要子项“User2”下。主要孩子可以是任何名字,我将在此之后更改它。 “PutAsync”会将新用户数据放入该电子邮件子项中。

    请注意,在 AddUser 函数参数中看到的“用户”是我定义的一个类,它具有名字、姓氏、电子邮件、国家/地区、电话等用户属性。

    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函数中很容易获取。

    电子邮件“ibrahim155255@gmail.com”在转换为 base64 后变为“aWJyYWhpbTE1NTI1NUBnbWFpbC5jb20=”。

    在 GetUser 函数中,电子邮件被转换为 base64 格式,就像在 AddUser 函数中一样。如果 base64 电子邮件密钥子项存在于“User2”子项中,则返回用户数据。

    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;
                }
            }
    

    我希望这个答案是有用的。如果对你有帮助,请点赞回答,我将不胜感激。

    【讨论】:

    • 感谢您的分享,请不要忘记三天后标记答案。
    • @LeonLu-MSFT 很高兴听到这个消息。感谢您让我知道将其标记为已回答,我不知道,现在我知道了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2012-04-13
    • 2010-09-07
    • 2016-12-11
    相关资源
    最近更新 更多