【问题标题】:How do you get the value of a key in Firebase Database and pass it to a TextField?如何获取 Firebase 数据库中键的值并将其传递给 TextField?
【发布时间】:2018-01-13 14:06:42
【问题描述】:

我想知道如何使用 Objective C 在我的 JSON 数据库中找到键的值并将其传递给文本字段。我想从我的数据库中的第三个键收集数据(当然不包括标题节点),但是关于如何做的每一个解释似乎都不起作用。遍历到正确位置的代码是:

FIRUser *user = [FIRAuth auth].currentUser;
NSString* username = _usernameEntry.text;
if (user)
{
    [[[[_ref child: @"Users"] child:user.uid] child:@"Username"]observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot * _Nonnull snapshot)
    {
        User *username = [[User alloc] initWithUsername:snapshot.value[@"username"]];
    }
    withCancelBlock:^(NSError * _Nonnull error)
    {
        NSLog(@"%@", error.localizedDescription);
    }];

    _emailAddressEntry.text = user.email;
}

对我来说。我的意图是让用户名文本字段在视图控制器导航到时显示当前用户名。这样用户就可以看到它现在是什么并对其进行编辑,如果有任何错误输入/不令他们满意(类似于电子邮件文本字段的处理方式)。

旁注,用户名和电子邮件的存储/修改如下:

NSString *userID = [FIRAuth auth].currentUser.uid;
NSString* username = _usernameEntry.text;

[[[_ref child:@"Users"] child:userID] setValue:@{@"Username": username}];

[[FIRAuth auth].currentUser updateEmail:_emailAddressEntry.text
                             completion:^(NSError * _Nullable error)
 {
     if(error)
     {
         [_emailValidationCheck setTextColor:[UIColor redColor]];
         _emailValidationCheck.text = @"Email Address modification was unsuccessful";
     }
     else
     {
         [_emailValidationCheck setTextColor:[UIColor greenColor]];
         _emailValidationCheck.text = @"Email Address modification was successful";
     }
 }];
}

另外,我对另外两件事有疑问。 1)为什么用户ID键总是在这个遍历中被覆盖?我在注册视图控制器中将其定义为具有名称 User_ID 和 uid 的值,但是当人们在我的应用程序的个人资料页面上编辑他们的用户名时,它会被覆盖并变成密钥。在此之前,它只是变成了名称(没有值)。

【问题讨论】:

  • 您是在问如何从 Firebase 发送 Read Data 吗?它包含在该文档中; ObjC 和斯威夫特。一般来说,请包含您的 Firebase 结构的 sn-p 以及您尝试过的代码,以便我们了解您的用例(请作为文本,没有图像)。另外,请查看以下两个提问指南:How do I ask a good question?How to create a Minimal, Complete, and Verifiable example。更新您的问题,我们来看看!
  • 您好,感谢您的评论。我已经尝试过使用文档,它没有产生有用的结果。
  • 您的代码设置了对数据库中节点的引用。你遇到了什么问题?
  • 附带说明,Firebase 中确实没有 第三个节点;节点是键:值对,通常通过节点名称(键)读取。虽然有可用的数组(带有数字索引),但应该避免使用它们。
  • 您的代码似乎覆盖了用户名,因为它被定义为 _usernameEntry.text 一次,然后被用户名 = [[[ 行覆盖。您如何将用户名存储在 Firebase 中?也许包括您的结构将有助于我们了解您的用例,因为它在代码中有点不清楚。

标签: ios objective-c firebase firebase-realtime-database


【解决方案1】:
FIRUser *user = [FIRAuth auth].currentUser;

if (user)
{
    [[[[_ref child: @"Users"] child:user.uid] child:@"Username"] observeSingleEventOfType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot)
    {
        if (snapshot.exists)
        {
            _usernameEntry.text = snapshot.value;
        }
    }];

    _emailAddressEntry.text = user.email;
}

是我解决问题的方法吗?

【讨论】:

  • 您可能知道也可能不知道,但 _emailAddressEntry 行代码将在 Firebase 块之前执行,因为它是异步的。 If 可能不会影响您的代码,因为我们不知道整个用例,但如果您将来遇到问题 - 这可能是其中的一部分。最好将它包含在块内,以便同时填充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2023-03-22
  • 2021-06-19
  • 1970-01-01
  • 2021-03-10
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多