Поле обновления PostgreSQL для каждого элемента в массиве

Кажется, что putFragment / getFragment это просто безопасный способ хранения фрагментов и его состояний внутри диспетчера фрагментов без его отображения.

Например, у вас есть 2 фрагмента, которые хранятся в ваших полях активности. Вы показываете один из них, а затем заменяете его другим, после чего вы меняете ориентацию экрана. Поля в вашей деятельности возобновляются, но фрагмент, который в настоящее время отображается, сохраняет свое состояние, а другие нет. Но если вы храните фрагменты внутри менеджера фрагментов, у вас будет два фрагмента с фактическими состояниями.

0
задан jonsploder 4 March 2019 в 08:34
поделиться

1 ответ

Вы можете объединить все необходимые UUID в одном выражении:

select w1.uid, array_agg(w2.uid order by wl.idx) as uuidlist
from words w1
  cross join lateral unnest(w1.wordlist) with ordinality as wl(word,idx) 
  join words w2 on w2.word = wl.word
where w1.wordlist is not null
  and w1.uuidlist is null -- optional
group by w1.uid;

Опция with ordinality возвращает дополнительный столбец, который указывает положение элемента в исходном массиве. Это необходимо для агрегирования UUID в правильном порядке.

Это возвращает следующий результат с вашими примерами данных:

uid  | uuidlist  
-----+------------
cccc | {aaaa,bbbb}

Это может использоваться в качестве источника оператора обновления (при условии, что столбец uid уникален):

update words
  set uuidlist = t.uuidlist
from (
  select w1.uid, array_agg(w2.uid order by wl.idx) as uuidlist
  from words w1
    cross join lateral unnest(w1.wordlist) with ordinality as wl(word,idx)
    join words w2 on w2.word = wl.word
  where w1.wordlist is not null
    and w1.uuidlist is null -- optional
  group by w1.uid
) t
where t.uid = words.uid;

Пример в сети: https://rextester.com/LZUYC57184

(обратите внимание, что отображение массивов в этом примере немного странно) [ 1111]

0
ответ дан a_horse_with_no_name 4 March 2019 в 08:34
поделиться
Другие вопросы по тегам:

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