【问题标题】:Firebase - Saving dataFirebase - 保存数据
【发布时间】:2018-02-20 08:48:46
【问题描述】:

我有一个关于火力基地的问题。

我正在开发一个包含三个屏幕的应用程序:“注册屏幕”,用户将在其中创建一个包含电子邮件和密码的帐户。 “构建个人资料屏幕”,用户将在其中回答一些要在其个人资料中实施的问题(例如“你叫什么名字?”)。最后是“个人资料屏幕”,其中将显示用户信息,例如用户名。

在'注册屏幕'我没有问题,用户填写邮箱输入和密码输入,点击“创建账户”,调用.createUserWithEmailAndPassword,用户账户是创建并被带到“建筑资料屏幕”。我遇到的问题是在“建筑资料屏幕”中。我的问题是:如何保存用户名和其他数据? 我读了一些关于这个主题的文章,但我很难理解。你们中的任何人都可以帮我解决这个问题吗?

【问题讨论】:

  • 你在哪里保存数据?数据库?

标签: firebase react-native firebase-realtime-database firebase-authentication


【解决方案1】:

您将要在 firebase 中为每个用户创建一个或多个节点来保存他们的用户特定信息。数据库结构可以像这样统一:

users: {
  uid_a: {
    username: 'uid_as_username',
    email: 'uid_as_email',
    name: 'uid_as_name',
    other_attribute: 'uid_as_other_attribute_value'
    [,...]
  },
  uid_b: {
    username: 'uid_bs_username',
    email: 'uid_bs_email',
    name: 'uid_bs_name',
    other_attribute: 'uid_bs_other_attribute_value'
    [,...]
  }
  [,...]
}

或像这样分开:

usernames: {
  uid_a: 'uid_as_username',
  uid_b: 'uid_bs_username'
  [,...]
},
emails: {
  uid_a: 'uid_as_email',
  uid_b: 'uid_bs_email'
  [,...]
},
names: {
  uid_a: 'uid_as_name',
  uid_b: 'uid_bs_name'
  [,...]
},
other_attribute: {
  uid_a: 'uid_as_other_attribute_value',
  uid_b: 'uid_bs_other_attribute_value'
  [,...]
}

您选择的是设计选择,但这就是想法。

【讨论】:

    【解决方案2】:

    作为@Vincent 答案的补充,默认情况下,您可以将用户名、电子邮件和 photoUrl 存储在 firebase auth 中(阅读获取用户配置文件:https://firebase.google.com/docs/auth/web/manage-users)。

    如果您需要存储更多信息,例如邮政地址、电话号码等,您可以在数据库中创建一个节点,例如 users,并存储您需要的所有数据。您甚至可以使用为身份验证创建的相同 UID 作为数据库的 ID。这样你以后获取用户信息会更容易。

    当您使用电子邮件和密码创建用户时,您可以返回 user 并使用类似这样的脚本将其添加到您的数据库中

    firebase.database.ref(`Users/${user.uid}`).set({
    name: this.state.name,
    email: this.state.email,
    });
    

    以上面的代码为例。

    更喜欢使用.set() 而不是.push()。如果您使用.push(),firebase 将创建一个您无法更改的随机 id。使用.set() 可以确定节点的值。

    希望对你有帮助。

    【讨论】:

    • 要在f​​irebase auth中存储用户名和邮箱,我不会使用.createUserWithEmailAndPassword,对吧?
    • 如果您使用.createUserWithEmailAndPassword,您必须提供用户的电子邮件。所以,是的。您将使用它将电子邮件存储在 firebase auth 中。在 user 对象 (firebase.auth().currentUser) 中有一个名为 displayName 的属性,firebase 使用它来存储经过身份验证的用户名。因此,如果您只需要存储用户名,则无需在数据库中为其创建节点,只需使用user 默认为您提供的属性即可。但是,如果您使用任何其他身份验证类型,您只需在数据库中创建一个节点 Users/ 来存储它的数据。希望对您有所帮助。
    【解决方案3】:

    这取自官方文档,可能会为您提供如何更新和从数据库中获取数据的线索。

    为 Android 设置 Firebase 实时数据库

    将您的应用连接到 Firebase

    安装 Firebase SDK。在 Firebase 控制台中,将您的应用添加到 您的 Firebase 项目。将实时数据库添加到您的应用中

    将 Firebase 实时数据库的依赖项添加到您的应用级别 build.gradle 文件:

    compile 'com.google.firebase:firebase-database:11.2.2'
    

    配置 Firebase 数据库规则

    实时数据库提供了一种声明性规则语言, 允许您定义数据的结构,应该如何 被索引,以及何时可以读取和写入您的数据。经过 默认情况下,对数据库的读写访问受到限制,因此只有 经过身份验证的用户可以读取或写入数据。开始没有 设置身份验证,您可以配置公共规则 使用权。这确实使您的数据库对任何人开放,即使是不开放的人 使用您的应用程序,因此请确保在您使用时再次限制您的数据库 设置身份验证。

    写入您的数据库

    使用 getInstance() 和 引用您要写入的位置。

    // Write a message to the database
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("message");
    
    myRef.setValue("Hello, World!");
    

    您可以通过这种方式将一系列数据类型保存到数据库中,包括 Java 对象。当您保存对象时,来自任何 getter 的响应 将保存为此位置的子位置。

    从您的数据库中读取

    要让您的应用数据实时更新,您应该添加一个 ValueEventListener 指向您刚刚创建的引用。

    该类中的onDataChange()方法在 每次数据更改时都会附加侦听器,包括 孩子们。

    // Read from the database
    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
            String value = dataSnapshot.getValue(String.class);
            Log.d(TAG, "Value is: " + value);
        }
    
        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多