public List<VO_Materiais> getMateriais(VO_Materiais parametros) {
    List<VO_Materiais> materiais = new ArrayList<>();

    String select = ajustaParametros(parametros);
    if (select.isEmpty()) {
      select = Contrato_VendasFacil.Materiais.SELECT;
    } else {
      select =
          Contrato_VendasFacil.Materiais.SELECT + Contrato_VendasFacil.WHERE + "1 = 1" + select;
    }

    // todo: getReadableDatabase
    DAO_VendasFacil dao = new DAO_VendasFacil(fragmento);
    SQLiteDatabase db = dao.getTabelaLeitura();

    Cursor cursor = db.rawQuery(select, null);

    int ColCodMaterial = cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_ID_COD_MATERIAL);
    int ColDesMaterial = cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_DES_MATERIAL);
    int ColFoto = cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_FOTO);
    int ColQtdMin = cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_QTD_MINIMA);
    int ColQtdEst = cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_QTD_ESTOQUE);
    int ColUndMed = cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_COD_UNIDADE_MEDIDA);
    int ColDtaUltCompra =
        cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_DATA_ULTIMA_COMPRA);

    // Garante que pelo menos uma linha existe no cursor
    if (cursor.moveToFirst()) {
      for (int i = 0; i < cursor.getCount(); i++, cursor.moveToNext()) {
        VO_Materiais material = new VO_Materiais(fragmento);
        material.setCodMaterial(cursor.getInt(ColCodMaterial));
        material.setDesMaterial(cursor.getString(ColDesMaterial));
        material.setFotoByteArray(cursor.getBlob(ColFoto));
        material.setQtdMinima(cursor.getFloat(ColQtdMin));
        material.setQtdEstoque(cursor.getFloat(ColQtdEst));
        material.setCodUnidadeMedida(cursor.getInt(ColUndMed));
        material.setDataUltimaCompraLong(cursor.getLong(ColDtaUltCompra));

        materiais.add(i, material);
      }
    }
    cursor.close();
    db.close();
    // todo: close()
    return materiais;
  }
  public void setEstoque(VO_Materiais materiais) {
    try {
      String queryString = Contrato_VendasFacil.Materiais.UPDATE_ESTOQUE;

      // todo: getWritableDatabase
      DAO_VendasFacil dao = new DAO_VendasFacil(fragmento);
      SQLiteDatabase db = dao.getTabelaGravacao();

      SQLiteStatement query = db.compileStatement(queryString);

      query.bindDouble(1, materiais.getQtdEstoque());
      query.bindLong(2, materiais.getDataUltimaCompraAsLong());
      query.bindLong(3, materiais.getCodMaterialInteger());

      query.executeInsert();
      db.close();
      // todo: close()
    } catch (Exception e) {
      Toasts.mensagemErro(fragmento, e.getMessage(), "DAO_Material.setEstoque");
    }
  }
  public void setMateriais(VO_Materiais materiais, int operacao) {
    try {
      String queryString = null;

      switch (operacao) {
        case INSERE:
          queryString = Contrato_VendasFacil.Materiais.INSERT;
          break;

        case ATUALIZA:
          queryString = Contrato_VendasFacil.Materiais.UPDATE;
          break;
      }

      if (materiais.getCodMaterialString().isEmpty()) {
        materiais.setCodMaterial(proximoCodigoMaterial());
      }
      // todo: getWritableDatabase
      DAO_VendasFacil dao = new DAO_VendasFacil(fragmento);
      SQLiteDatabase db = dao.getTabelaGravacao();

      SQLiteStatement query = db.compileStatement(queryString);

      // Ambas as querys (insert e update) estão montadas com os campos na mesma sequencia
      // Assim é possível utilizar o mesmo trecho de código abaixo para ambos os casos.
      query.bindString(1, materiais.getDesMaterial());
      query.bindBlob(2, materiais.getFotoByteArray());
      query.bindDouble(3, materiais.getQtdMinima());
      query.bindDouble(4, materiais.getQtdEstoque());
      query.bindLong(5, materiais.getCodUnidadeMedida());
      query.bindLong(6, materiais.getDataUltimaCompraAsLong());
      query.bindLong(7, materiais.getCodMaterialInteger());

      query.executeInsert();
      db.close();
      // todo: close()
    } catch (Exception e) {
      Toasts.mensagemErro(fragmento, e.getMessage(), "DAO_Material.setMateriais");
    }
  }
  private Integer proximoCodigoMaterial() {
    // todo: getReadableDatabase
    DAO_VendasFacil dao = new DAO_VendasFacil(fragmento);
    SQLiteDatabase db = dao.getTabelaLeitura();

    Cursor cursor = db.rawQuery(Contrato_VendasFacil.Materiais.LAST_ID, null);
    Integer proximo = 0;

    if (cursor.moveToFirst()) {
      do {
        proximo =
            (Integer.parseInt(
                cursor.getString(
                    cursor.getColumnIndex(Contrato_VendasFacil.Materiais.C_ID_COD_MATERIAL))));
      } while (cursor.moveToNext());
    }

    cursor.close();
    db.close();
    // todo: close()
    return proximo + 1;
  }