Problemas com arraylist listar itens do firebase Index: 0, Size: 0

tenho esse erro. Coloquei os códigos de PesquisaFragment,Usuario.java,AdapterPesquisa.java consigo efetuar a pesquisa é exibida no recyclerview mas ao clicar por não ter um arraylist correto acaba dando esse erro. já tentei de varias formas e não consigo corrigir isso alguém poderia me orientar de como adaptar esse arraylist para o nó grupos corretamente? erro marcado com a tag “LINHA89” no fragment_pesquisa agradeço desde já qualquer ajuda. abaixo uma img da estrutura do meu banco de dados. ->>

ESTRUTURA FIREBASE REALTIME DATABASE IMG

 W/PersistentConnection: pc_0 - Using an unspecified index. Consider adding '".indexOn": "nome"' at grupos to your security and Firebase Database rules for better performance W/ClassMapper: No setter/field for membros found on class xxx.xxx.model.Usuario     No setter/field for id found on class xxx.xxx.model.Usuario W/ClassMapper: No setter/field for membros found on class xxx.xxx.model.Usuario W/ClassMapper: No setter/field for id found on class xxx.xxx.model.Usuario W/PersistentConnection: pc_0 - Using an unspecified index. Consider adding '".indexOn": "nome"' at grupos to your security and Firebase Database rules for better performance     java.lang.IndexOutOfBoundsException: Index: 0, Size: 0         at java.util.ArrayList.get(ArrayList.java:437)         at xxx.xxx.fragment.PesquisaFragment$  1.onItemClick(PesquisaFragment.java:89)         at xxx.xxx.helper.RecyclerItemClickListener.onInterceptTouchEvent(RecyclerItemClickListener.java:21) 

PESQUISA FRAGMENT

public class PesquisaFragment extends Fragment {      //Widget     private SearchView searchViewPesquisa;     private RecyclerView recyclerPesquisa;     private List<Conversa> listaConversas = new ArrayList<>();     private ConversasAdapter adapter;     private List<Usuario> listaUsuarios;     private DatabaseReference usuariosRef;     private AdapterPesquisa adapterPesquisa;     private String idUsuarioLogado;      public PesquisaFragment() {         // Required empty public constructor     }       @Override     public View onCreateView(LayoutInflater inflater, ViewGroup container,                              Bundle savedInstanceState) {         // Inflate the layout for this fragment         View view = inflater.inflate(R.layout.fragment_pesquisa, container, false);          searchViewPesquisa = view.findViewById(R.id.searchViewPesquisa);         recyclerPesquisa   = view.findViewById(R.id.recyclerPesquisa);         adapter = new ConversasAdapter(listaConversas, getActivity());          //Configurações iniciais         listaUsuarios = new ArrayList<>();         usuariosRef = ConfiguracaoFirebase.getFirebaseDatabase()                 .child("grupos");         idUsuarioLogado = UsuarioFirebase.getIdentificadorUsuario();          //Configura RecyclerView         recyclerPesquisa.setHasFixedSize(true);         recyclerPesquisa.setLayoutManager(new LinearLayoutManager(getActivity()));          adapterPesquisa = new AdapterPesquisa(listaUsuarios, getActivity());         recyclerPesquisa.setAdapter( adapterPesquisa );          //Configurar evento de clique         recyclerPesquisa.addOnItemTouchListener(new RecyclerItemClickListener(                 getActivity(),                 recyclerPesquisa,                 new RecyclerItemClickListener.OnItemClickListener() {                     @Override                     public void onItemClick(View view, int position) {                         List<Conversa> listaConversasAtualizada = adapter.getConversas();                         LINHA89 - > Conversa conversaSelecionada = listaConversasAtualizada.get( position );                          if( conversaSelecionada.getIsGroup().equals("true") ){                              Intent i = new Intent(getActivity(), ChatActivity.class);                             i.putExtra("chatGrupo", conversaSelecionada.getGrupo() );                             startActivity( i );                          }else {                             Intent i = new Intent(getActivity(), ChatActivity.class);                             i.putExtra("chatContato", conversaSelecionada.getUsuarioExibicao() );                             startActivity( i );                         }                      }                      @Override                     public void onLongItemClick(View view, int position) {                      }                      @Override                     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                      }                 }         ));          //Configura searchview         searchViewPesquisa.setQueryHint("Buscar usuários");         searchViewPesquisa.setOnQueryTextListener(new SearchView.OnQueryTextListener() {             @Override             public boolean onQueryTextSubmit(String query) {                  return false;             }              @Override             public boolean onQueryTextChange(String newText) {                 String textoDigitado = newText.toUpperCase();                 pesquisarUsuarios( textoDigitado );                 return true;             }         });            return view;     }      private void pesquisarUsuarios(String texto){          //limpar lista         listaUsuarios.clear();          //Pesquisa usuários caso tenha texto na pesquisa         if( texto.length() >= 2 ){              Query query = usuariosRef.orderByChild("nome")                     .startAt(texto)                     .endAt(texto + "\uf8ff" );              query.addListenerForSingleValueEvent(new ValueEventListener() {                 @Override                 public void onDataChange(DataSnapshot dataSnapshot) {                      //limpar lista                     listaUsuarios.clear();                      for( DataSnapshot ds : dataSnapshot.getChildren() ){                          //verifica se é usuário logado e remove da lista                         Usuario usuario = ds.getValue(Usuario.class);                         if ( idUsuarioLogado.equals( usuario.getId() ) )                             continue;                          //adiciona usuário na lista                         listaUsuarios.add( usuario );                      }                      adapterPesquisa.notifyDataSetChanged();                      /*                     int total = listaUsuarios.size();                     Log.i("totalUsuarios", "total: " + total );                     */                 }                  @Override                 public void onCancelled(DatabaseError databaseError) {                  }             });          }      }  } 

USUARIO.JAVA

public class Usuario implements Serializable {      private String id;     private String nome;     private String email;     private String senha;     private String foto;       public Usuario() {     }      public void salvar(){          DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();         DatabaseReference usuario = firebaseRef.child("usuarios").child( getId() );          usuario.setValue( this );      }      public void atualizar(){          String identificadorUsuario = UsuarioFirebase.getIdentificadorUsuario();         DatabaseReference database = ConfiguracaoFirebase.getFirebaseDatabase();          DatabaseReference usuariosRef = database.child("usuarios")                 .child( identificadorUsuario );          Map<String, Object> valoresUsuario = converterParaMap();          usuariosRef.updateChildren( valoresUsuario );      }      @Exclude     public Map<String, Object> converterParaMap(){          HashMap<String, Object> usuarioMap = new HashMap<>();         usuarioMap.put("email", getEmail() );         usuarioMap.put("nome", getNome() );         usuarioMap.put("foto", getFoto() );          return usuarioMap;      }      public String getFoto() {         return foto;     }      public void setFoto(String foto) {         this.foto = foto;     }      @Exclude     public String getId() {         return id;     }      public void setId(String id) {         this.id = id;     }      public String getNome() {         return nome;     }      public void setNome(String nome) {         this.nome = nome;     }      public String getEmail() {         return email;     }      public void setEmail(String email) {         this.email = email;     }      @Exclude     public String getSenha() {         return senha;     }      public void setSenha(String senha) {         this.senha = senha;     } } 

ADAPTER PESQUISA

public class AdapterPesquisa extends RecyclerView.Adapter<AdapterPesquisa.MyViewHolder> {      private List<Usuario> listaUsuario;     private Context context;      public AdapterPesquisa(List<Usuario> l, Context c) {         this.listaUsuario = l;         this.context = c;     }      @Override     public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {          View itemLista = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_pesquisa_usuario, parent, false);         return new MyViewHolder(itemLista);      }      @Override     public void onBindViewHolder(MyViewHolder holder, int position) {          Usuario usuario = listaUsuario.get(position);          holder.nome.setText( usuario.getNome() );          //if( usuario.getCaminhoFoto() != null ){           //  Uri uri = Uri.parse( usuario.getCaminhoFoto() );          //   Glide.with(context).load(uri).into(holder.foto);         //}else {        //     holder.foto.setImageResource(R.drawable.avatar);         }      //}      @Override     public int getItemCount() {         return listaUsuario.size();     }      public class MyViewHolder extends RecyclerView.ViewHolder {          CircleImageView foto;         TextView nome;           public MyViewHolder(View itemView) {             super(itemView);              foto = itemView.findViewById(R.id.imageFotoPesquisa);             nome = itemView.findViewById(R.id.textNomePesquisa);          }     }  } 

Verificar itens checados e aplicar a lógica

Bom dia, estou estudando javascript e me deparei com um problema: Criei uma lógica onde disponibilizo dois botões, um para liberar acesso que quando clicado fica na tela apenas o ícone de check, e o bloquear que quando clicado fica apenas o ícone de bloqueado. O problema é que se podem ser mudado os ícones dos itens checados, porém, mesmo com os dois itens checados o único que muda o ícone é o primeiro. Estou mudando o ícone deixando seu display “none” e “initial” fiz dessa forma porque não conheço outra forma, se souberem algo com javascript agradeço, mas, a questão é como faço para a mudança de ícone acontecerem em todos itens checados e não apenas no primeiro ? Obrigado.

JS:

    function bloquearAcesso(){     let inputs = document.querySelectorAll(".checar");      for(let i = 0; i< inputs.length; i++){         if(inputs[i].checked == true){            document.getElementById("liberado").style.display = "none";           document.getElementById("bloqueado").style.display = "initial";       }   };      };    function liberarAcesso(){     let inputs = document.querySelectorAll(".checar");          for(let i = 0; i < inputs.length; i++){       if (inputs[i].checked == true){       document.getElementById("bloqueado").style.display = "none";       document.getElementById("liberado").style.display = "initial";       };   };   } 

HTML:

<html>     <body> <div class="box-body no-padding">         <table class="table table-striped">           <thead>             <tr>               <th>Patio</th>               <th>Acessar Desktop</th>               <th>Criado em</th>              </tr>           </thead>           <tbody>              <tr>               <td><input class="checar" type="checkbox">Patio1</td>               <td> <i id="liberado" class="fa fa-check"></i> &nbsp; <i id="bloqueado" class="far fa-times-circle"></i></td>               <td>02/04/2018</td>               <td>                </td>             </tr>              <tr>                     <td><input class="checar" type="checkbox">Patio2</td>                     <td> <i id="liberado" class="fa fa-check"></i> &nbsp; <i id="bloqueado" class="far fa-times-circle"></i></td>                     <td>02/04/2018</td>                   </tr>                     <br/>             </tbody>           </table>         <button onclick="liberarAcesso()" type="button" class="btn btn-primary btn-xs btn-flat">Liberar acesso</button>         <button onclick="bloquearAcesso()" type="button" class="btn btn-danger btn-xs btn-flat">Bloquear acesso</button>         </div>        <script src="./curso.js">       </script> </body> </html> 

Desafio JSON e JS separar itens

tenho seguinte código, que e verifica quando o número foi pulado

const dados = [   { "cnpj": "1234567891011", "serie": "1", "numero": "1" },   { "cnpj": "1234567891011", "serie": "1", "numero": "2" },   { "cnpj": "1234567891011", "serie": "1", "numero": "3" },   { "cnpj": "1234567891011", "serie": "1", "numero": "4" },   { "cnpj": "1234567891011", "serie": "1", "numero": "5" },   { "cnpj": "1234567891011", "serie": "1", "numero": "6" },   { "cnpj": "1234567891011", "serie": "1", "numero": "7" },   { "cnpj": "1234567891011", "serie": "1", "numero": "9" },   { "cnpj": "1234567891011", "serie": "1", "numero": "10" },   { "cnpj": "1213141516171", "serie": "1", "numero": "1" },   { "cnpj": "1213141516171", "serie": "1", "numero": "2" },   { "cnpj": "1213141516171", "serie": "1", "numero": "4" },   { "cnpj": "1213141516171", "serie": "1", "numero": "5" },   { "cnpj": "1213141516171", "serie": "1", "numero": "6" },   { "cnpj": "1213141516171", "serie": "1", "numero": "7" },   { "cnpj": "1213141516171", "serie": "1", "numero": "9" },   { "cnpj": "1213141516171", "serie": "2", "numero": "10" },   { "cnpj": "1213141516171", "serie": "2", "numero": "11" },   { "cnpj": "1213141516171", "serie": "2", "numero": "12" },   { "cnpj": "1213141516171", "serie": "2", "numero": "15" },   { "cnpj": "1213141516171", "serie": "2", "numero": "16" },   { "cnpj": "1213141516171", "serie": "2", "numero": "17" },   { "cnpj": "1213141516171", "serie": "2", "numero": "21" },   { "cnpj": "9090909871234", "serie": "1", "numero": "22" },   { "cnpj": "9090909871234", "serie": "1", "numero": "1" },   { "cnpj": "9090909871234", "serie": "1", "numero": "2" },   { "cnpj": "9090909871234", "serie": "1", "numero": "3" },   { "cnpj": "9090909871234", "serie": "1", "numero": "4" },   { "cnpj": "9090909871234", "serie": "1", "numero": "6" },   { "cnpj": "9090909871234", "serie": "1", "numero": "7" },   { "cnpj": "9090909871234", "serie": "1", "numero": "8" },   { "cnpj": "9090909871234", "serie": "3", "numero": "2" },   { "cnpj": "9090909871234", "serie": "3", "numero": "1" },   { "cnpj": "9090909871234", "serie": "3", "numero": "3" },   { "cnpj": "9090909871234", "serie": "3", "numero": "4" },   { "cnpj": "9090909871234", "serie": "3", "numero": "5" },   { "cnpj": "9090909871234", "serie": "3", "numero": "6" },   { "cnpj": "9090909871234", "serie": "3", "numero": "7" },   { "cnpj": "9090909871234", "serie": "3", "numero": "8" },   { "cnpj": "9090909871234", "serie": "3", "numero": "9" },   { "cnpj": "9090909871234", "serie": "3", "numero": "10" } ];  const organizados = dados.reduce((acumulador, { cnpj, numero }) => {   const copia = { ...acumulador };   copia[cnpj] = [...(copia[cnpj] || []), parseInt(numero, 10)];   return copia; }, {});  const faltando = Object.keys(organizados).reduce((acumulador, cnpj) => {   const numeros = organizados[cnpj];   const [minimo, maximo] = [Math.min(...numeros), Math.max(...numeros)];   const copia = { ...acumulador };   copia[cnpj] = Array.from(Array(maximo-minimo), (v, indice) => indice + minimo).filter(item => !numeros.includes(item));   return copia; }, {});  console.log('CNPJs organizados: ', JSON.stringify(organizados)); console.log('Números faltando: ', JSON.stringify(faltando));

gostaria que a saída fosse organizada por exemplo:

cnpj: 1234567891011 série 1: 19 série 2: 13, 18, 19, 20

Como contar os itens e paginar o resultado da query no Loopback 4?

Tenho o seguinte repositório:

import { DefaultCrudRepository } from '@loopback/repository'; import { User } from '../models'; import { DbDataSource } from '../datasources'; import { inject } from '@loopback/core';  export class UserRepository extends DefaultCrudRepository<User,typeof User.prototype.id> {   constructor(     @inject('datasources.db') dataSource: DbDataSource,   ) {     super(User, dataSource);   } } 

No meu controlador, quando executo this.userRepository.find() é retornado todos os usuários cadastrados na minha base de dados, porém, preciso retornar este resultado paginado,eu passei as opções limit e offset para o método find() mas preciso da quantidade total de usuários que foram encontrados.

Select que agrupe itens com palavras relacionadas entre o mesmo campo

Bom dia, tenho um banco de dados de aproximadamente 40 mil linhas referente a cada produto uma linha.

Eu estava usando uma tabela de catalogo (o mesmo que categoria) onde cada item (produto) que fosse inserido fosse destinado ao catalogo x e y, ou só x, assim a pessoa adicionava o produto e marcava em qual ou quais catalogos ele apareceria.

No site teria os catalogos, onde clica e aparece os produtos, semelhante a categoria, mas ficaria mais particular ao catalogo.

Funcionou muito bem mas devido ao requisito de agilidade e importação de anuncios (produtos) em grande demanda ficou inviável o cadastro um por um selecionando catalogo.

Retirei essa função e agora é tudo importado, já que o produto vem de uma plataforma principal sempre e não há necessidade de criar duas vezes o mesmo produto.

Quero que o sistema crie catalogos de forma inteligente, mesmo que o sistema fique meio “burrinho”.

Minha idéia é, ao importar por exemplo 10 produtos, sendo que, 2 deles estejam assim:

Cordão de Tenis

Tenis Nike

O Sistema identifique que há palavras iguais no texto, e agrupe.

Como eu quero um sistema inteligente, eu não quero que ele crie o catalogo no banco, e sim, na hora do select aconteça tudo.

Ou seja, um select para criar os catalogos, onde a pessoa vai clicar em cima, e posteriormente outro select para mostrar o resultado.

Terá de ter o resultado Tenis quando encontrar estes 2 itens com relação de texto igual, assim em diante se encontrar mais, entenderam ?

Para não ficar tudo muito bagunçado já que eu tenho muito produto e eu quero algo meio inteligente, seria, no fim ele identificar a quantidade de nomes semelhantes, e antes de criar os catalogos, fosse feito uma contagem daqueles que mais se repetiu, e ai sim, criar os catalogos, por exemplo 50 mais repetido, pra não ficar muito redundante repetindo catalogos diferentes para os mesmos itens, mas com algo que, eu não perdesse itens que tiveram pouca pontuação, visto que se tiver muito igual vao subir no rank, e aqueles com pouco igual pode ser que sejam unicos, e não redundante.

O que vier de código está bem vindo para inicio!

Cadastrar itens na tabela associada caso não exista

Tenho os seguintes modelos:

const Post = sequelize.define('Post', {     title: DataTypes.TEXT,     body: DataTypes.TEXT,     publish_date: DataTypes.DATE   }, { tableName: 'post' });    Post.associate = function({ Tag }) {     Post.belongsToMany(Tag, { through: 'post_tags', as: 'tags' })   };    const Tag = sequelize.define('Tag', {     name: DataTypes.STRING   }, { tableName: 'tag' }); 

Quando eu tento fazer esta inserção:

Post.create({   tags: [     { name: 'New Tag' },     { id: 1, name: 'Existing Tag' },   ],   title: 'Hello!' }, {   include: [{ model: Tag, as: 'tags' }] }) 

É retornado um erro SequelizeUniqueConstraintError: Validation error pois a tag que eu estou cadastrando já existe no banco.

É possível fazer com que o sequelize cadastre somente as tags que não estão cadastradas na tabela tags e caso já existir somente referencia-las no post?

Como renderizar botões diferentes para certos itens do p:datatable?

Tenho um p:datatable onde eu tenho vários itens e a partir desses itens eu posso criar um outro tipo de item que vai ser mostrado em outra tela ao clicar em Visualizar. Mas onde eu ainda não tenha criado o tal item eu quero que apareça apenas o botão novo,que me permita criar o item e depois de criado, me mostre o botão Visualizar. Segue a baixo um exemplo para ilustrar o que eu estou querendo.

Exemplo