Почему я не могу получить все объекты на пути из базы данных firebase в ответ?

Пожалуйста, попробуйте ниже хранимую процедуру. Я уже проверял. Я получаю правильный результат, но не используя groupby.

CREATE DEFINER=`ks_root`@`%` PROCEDURE `first_five_record_per_id`()
BEGIN
DECLARE query_string text;
DECLARE datasource1 varchar(24);
DECLARE done INT DEFAULT 0;
DECLARE tenants varchar(50);
DECLARE cur1 CURSOR FOR SELECT rid FROM demo1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    SET @query_string='';

      OPEN cur1;
      read_loop: LOOP

      FETCH cur1 INTO tenants ;

      IF done THEN
        LEAVE read_loop;
      END IF;

      SET @datasource1 = tenants;
      SET @query_string = concat(@query_string,'(select * from demo  where `id` = ''',@datasource1,''' order by rate desc LIMIT 5) UNION ALL ');

       END LOOP; 
      close cur1;

    SET @query_string  = TRIM(TRAILING 'UNION ALL' FROM TRIM(@query_string));  
  select @query_string;
PREPARE stmt FROM @query_string;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

END
-1
задан Tholle 13 July 2018 в 20:12
поделиться

2 ответа

Вы устанавливаете state.messages = [] в функции удаления.

1
ответ дан EECOLOR 17 August 2018 в 12:10
поделиться
  • 1
    Я сделал так, пока он не работает – Joby Mathew 14 July 2018 в 05:43
  • 2
    Это означает, что при вызове remove все сообщения очищаются. – EECOLOR 14 July 2018 в 06:00
  • 3
    Но когда я перехожу назад, мне нужно получить все элементы, которые уже есть в объекте, вместо этого я получаю только последние данные в виде журнала консоли: (2) [{...}, {...}] 0: {текст: {...}, id: "-LHK9aJ7wmeSt0spqbLi"} 1: {text: {...}, id: "-LHM9najplQCSI92Utqc"} length: 2__proto__: Array (0) Announcement.js: 24 [] Vendor.js: 181 [] Vendor.js : 181 [] Vendor.js: 181 – Joby Mathew 14 July 2018 в 06:11
  • 4
    Без функционального (минимального) примера, демонстрирующего вашу проблему, почти невозможно помочь вам решить проблему. Пожалуйста, обновите свой вопрос с полным минимальным примером, который показывает проблему. В этом примере удалите ненужный код. – EECOLOR 14 July 2018 в 06:14
  • 5
    Хорошо, я сделаю это – Joby Mathew 14 July 2018 в 13:54

Помните, что setState() является асинхронной задачей, поэтому ваш код может не работать должным образом из-за условий гонки, а ваше состояние будет перезаписано.

Итак, вы можете инкапсулировать свою логику в такой функции:

loadData() {
  const messagesRef = fire
    .database()
    .ref("vendor/" + this.state.Day + "/" + this.state.Vendor + "/dishname")
    .orderByKey()
    .limitToLast(100);
  messagesRef.on("child_added", snapshot => {
    const message1 = { text: snapshot.val(), id: snapshot.key };
    console.log(this.state.messages);
    this.setState({
      // ...this.state, <-- You can ommit this, as you are only interested in 
      //                     setting the messages property
      messages: this.state.messages.concat(message1)
    });
  });
}

, а затем вызвать ее в componentDidMount, как это, используя функциональность обратного вызова setState:

componentDidMount() {
  this.setState({ ...this.state}, () => this.loadData());
}
2
ответ дан Rodrigo Mata 17 August 2018 в 12:10
поделиться
  • 1
    Он все еще не работает. В журнале консоли после перехода с другой страницы он возвращается как пустой объект: – Joby Mathew 14 July 2018 в 05:49
  • 2
    (2) [{...}, {...}] 0: {текст: {...}, id: & quot; -LHK9aJ7wmeSt0spqbLi & quot;} 1: {текст: {...}, id: "-LHM9najplQCSI92Utqc & quot;} длина: 2__proto__: Array (0) Announcement.js: 24 [] Vendor.js: 181 [] Vendor.js: 181 [] Vendor.js: 181 – Joby Mathew 14 July 2018 в 05:50
  • 3
    Можете ли вы попробовать настроить состояние в методе удаления следующим образом: this.setState({ messages: messages.filter(msg => msg.id !== id) });? – Rodrigo Mata 17 July 2018 в 14:26
  • 4
    Это не работает – Joby Mathew 18 July 2018 в 10:53
Другие вопросы по тегам:

Похожие вопросы: