Как мне найти указанный c путь в базе данных реального времени firebase, а затем изменить значение по этому пути, используя ввод текста? - PullRequest
0 голосов
/ 08 января 2020

Pop quiz, hotshot:

Вы создаете собственное приложение реакции. Вы устанавливаете некоторые значения для firebase как объекта в root вашего приложения, например:

firebase
      .database()
      .ref("/companies/")
      .set({
        awesomeCompany: {
          name: "Awesome Company",
          owner: "Joe Awesome",
          gmail: "joeawesome@gmail.com",
          fleetSize: 2
        },
        badCompany: {
          name: "Bad Company",
          owner: "Joe Bad",
          gmail: "joebad@gmail.com",
          fleetSize: 3
        }

Вы хотите дать текущему пользователю поле для ввода текста, через которое он может изменить fleetSize компания, если они являются владельцем этой компании.

У вас есть аутентификация firebase, работающая должным образом, поэтому вы знаете, что firebase.auth().currentUser.email будет работать для проверки, чтобы определить, являются ли они владельцем.

Значения вашей базы данных установлены - они выглядят так:

{
  "companies": {
    "awesomeCompany": {
      "fleetSize": 2,
      "gmail": "joeawesome@gmail.com",
      "name": "Awesome Company",
      "owner": "Joe Awesome"
    },
    "badCompany": {
      "fleetSize": 3,
      "gmail": "joebad@gmail.com",
      "name": "Bad Company",
      "owner": "Joe Bad"
    }
  }
}

Как бы вы отобразили исходную информацию на экране и как вы настроили бы логи ввода текста c чтобы пользовательский ввод изменял данные в базе данных?

Чтобы понять мой мозг и то, как я терплю неудачу, я включаю свой собственный код ниже в качестве отправной точки. Если есть способ показать мне, как я могу взять свою базовую стратегию c и заставить ее работать - даже если она не элегантна - я был бы признателен за это. Но в целом я просто очень борюсь с тем, как получить ссылки на пути к данным с помощью моментального снимка данных и сохранить их доступными для использования в других местах.

Спасибо за помощь, всем!

// my crummy half baked code below
import React, { Component } from "react";
import { View, Text, TextInput, Button } from "react-native";
import { styles } from "../styles";
import * as firebase from "firebase";

export default class OwnerProfileScreen extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      gmail: null,
      name: null,
      fleetSize: null
    };
  }

  componentDidMount() {
    this.getData();
  }

  getData = () => {
    const rootRef = firebase.database().ref(); // firebase reference
    const authEmail = firebase.auth().currentUser.email; // current user

    return rootRef.once("value").then(
      function(snapshot) {
        const idArray = Object.keys(snapshot.child("companies/").val()); // array of Ids

        const companyData = idArray.map(id =>
          snapshot.child("companies/" + id).val()
        ); //  values of contained in objects at each key

        const ownersCompany = companyData.filter(
          obj => obj.gmail === authEmail
        ); // an array containing one object if the gmail address in the object is the same as the currentUser logged in


           // what is the path of fleetSize?  
           // how do I define it to keep it available to use later 
           // with a Text Input event?

        this.setState({
          name: ownersCompany[0].name,
          gmail: ownersCompany[0].gmail,
          fleetSize: ownersCompany[0].fleetSize
        });
      }.bind(this)
    );
  };

  changeFleetSize = userInput => {
    //in order to set the user input to the database, I need the path
    //of the fleetSize of the current user (who has been verified as an 
    // owner by comparing firebase auth to gmail addresses of company)
  };

  render() {
    return (
      <View style={styles.container}>
        <Text>minPrice = {this.state.name}</Text>
        <Text>gmail = {this.state.gmail}</Text>
        <Text>fleetSize = {this.state.fleetSize}</Text>
        <TextInput
          style={{ height: 40, borderColor: "gray", borderWidth: 1 }}
          //onChangeText currently does nothing since I don't know how
          // to get the particular path of particular fleetSize 
          onChangeText={userInput => this.changeFleetSize(userInput)} 
        />
      </View>
    );
  }
}

1 Ответ

0 голосов
/ 09 января 2020

Код довольно грязный, поэтому трудно сказать, что вы пытаетесь выполнить sh. Но позвольте мне сделать предположение здесь:

  1. Вы хотите загрузить одну компанию из своей базы данных.
  2. Вы знаете адрес электронной почты владельца компании.

Если это так, вы можете использовать запрос для достижения sh цели. Примерно так:

var query = rootRef.child("companies").orderByChild("gmail").equalTo(authEmail);
var self = this;
query.once("value").then(function(result) {
  result.forEach(function(snapshot) { // loop over result snapshots, since there may be multiple
    const companyData = snapshot.val();

    self.setState({
      name: companyData.name,
      gmail: companyData.gmail,
      fleetSize: companyData.fleetSize
    });
  })
);

Изменения здесь:

  1. Используйте запрос, чтобы выбрать только компании с правильным адресом Gmail.
  2. L oop over результаты, поскольку (по крайней мере на уровне API) может быть несколько компаний с таким значением для их свойства gmail.
  3. Избавьтесь от всей итерации по Object.keys и фильтрации, поскольку это сделало его трудно читать Этот результат также более идиоматичен c для кода базы данных Firebase Realtime.
  4. Используйте self для отслеживания экземпляра this, просто потому что мне не хотелось подсчитывать bind вызовов.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...