Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.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# 如何使用FirebaseDatabase.Net在实时数据库中创建电子邮件密钥_C#_Firebase_Firebase Realtime Database_Xamarin.forms - Fatal编程技术网

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

C# 如何使用FirebaseDatabase.Net在实时数据库中创建电子邮件密钥,c#,firebase,firebase-realtime-database,xamarin.forms,C#,Firebase,Firebase Realtime Database,Xamarin.forms,我想创建用户电子邮件密钥,而不是自动生成的密钥。我之所以想这样做,是为了能够查询特定的电子邮件并获取该用户数据,而不是从用户子数据中获取所有用户,这并不方便,特别是如果用户数量将增长的话 我正在使用的是一个可用的nuget。它是Firebase实时数据库REST API之上的包装器 一个新用户被添加到具有自动生成的密钥的实时数据库中,如下所示。如果这些密钥是用户电子邮件,也许我可以查询用户电子邮件并获取特定的电子邮件子数据,如下面的代码: await firebase

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

我正在使用的是一个可用的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;
            }
        }

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

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

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

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

请注意,AddUser函数参数中的用户是我定义的一个类,它具有诸如firstname、lastname、email、country、phone等用户属性

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函数中相同。如果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;
            }
        }

我希望这个答案是有用的。如果它对您有帮助,请竖起大拇指回答,我将非常感谢。

谢谢您的分享,请不要忘记在三天后标记答案。@LeonLu MSFT听到这个消息很高兴。谢谢你让我知道如何标记它回答说,我不知道,现在我知道了。