JavascriptProva

giovedì 22 settembre 2016

Compilazione del database da inserire in J-Speaker

Adesso dobbiamo scrivere il codice per un "visore" del database.

Ho preparato row con due textViews, che spero siano posizionate adeguatamente.
Nel caso ce lo vediamo poi...

> Ecco, hai un modulo di Activity completamente vuoto. Inventa.

Innanzitutto devo istanziare la ListView.
I dati li prendo dal database.

    ListView listView;  
    Helper helper;
Ho dichiarato la listView e il database.
Qual è il passo successivo?

Mettere in un cursor tutti gli elementi della tabella del database, e passarli in una ArrayList.
Ma se ogni elemento contiene due voci, come fare? Metterli in un ArrayList non sotto forma di stringa, ma di elementi che istanziano una classe. Creiamo dunque una classe Record, che in due suoi membri possa accogliere i due campi di cui è formato ogni record del database.

Creo la classe.
    class Record{
        public String parola;
        public int numero;
        public Record(String parola, int numero){
            this.parola=parola;
            this.numero=numero;
        }
    }
Ora si prendono tutti i record del database e si pongono in oggetti di questa classe.
Ho a disposizione il metodo query() del database.

Un momento! Poni i campi di un record nei membri di un oggetto di tipo Record, ma poi devi aggiungere l'oggetto a una Lista, da presentare a un adapter.

Prima dunque creo la lista.
Riassumi
Creo una classe per contenere un record, creo una lista in cui archiviare tutti gli oggetti del tipo di questa classe, e man mano che scorre il Cursor creo un oggetto e lo archivio nella lista.

Bene, procedi.
Creo la lista: la lista deve avere come Tipo (fra parentesi angolari) Record.
    ArrayList lista;

.....

        lista=new ArrayList();
Ora, man mano che si creano gli elementi di tipo Record li appongo alla lista.

Ecco il codice completo per ottenere la lista di elementi del Cursor:
        lista=new ArrayList();
        
        Cursor crs=helper.query();
        crs.moveToFirst();
        do{
            lista.add(new Record(crs.getString(1),crs.getInt(2)));
        } while(crs.moveToNext());

Bene.
Ora si dovrà creare il ListView e l'adapter.

Istanziamo ListView.
listView=(ListView) findViewById(R.id.listView);
E ora dobbiamo estendere la classe ArrayAdapter per creare un CustomAdapter adatto alle nostre esigenze (due textViews).
    class CustomAdapter extends ArrayAdapter{

        public CustomAdapter(Context context, int resource, ArrayList arrayList) {
            super(context, resource, arrayList);
        }
    }
Ora ne overridiamo il metodo getView:
        @Override
        public View getView(int posizione, View convertView, ViewGroup viewGroup){
            LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(R.layout.row,null);

            return convertView;
        }
Questo inflata il layout row.
Però ora bisogna ricercare le due textViews e porvi i valori.
        @Override
        public View getView(int position, View convertView, ViewGroup viewGroup){
            LayoutInflater layoutInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView=layoutInflater.inflate(R.layout.row,null);
            TextView txtParola=(TextView)convertView.findViewById(R.id.textView3);
            TextView txtNumero=(TextView)convertView.findViewById((R.id.textView4));
            Record r=getItem(position); 
            txtParola.setText(r.parola);
            txtNumero.setText(""+r.numero);
            return convertView;
        }
    }
Ecco, l'ho fatta completa.
Adesso resta da attribuire al listView l'adapter e vediamo come va...

        CustomAdapter customAdapter=new CustomAdapter(this,R.layout.row,lista);
        listView.setAdapter(customAdapter);
Bene. Alla fine funziona, ma ci sono ancora dei dettagli: non vedo la textView con il numero.

Torniamo al Layout...

Semplicemente una non perfetta reminiscenza degli attributi da dare nel RelativeLayout.

Ho sistemato tutto. Sulla seconda activity ho una visione soddisfacente della tabella del database.

Ho messo a punto anche il meccanismo dell'immissione mediante un editText e un button, che inseriscono nuove parole nella tabella del database.

Ora devo mettere in opera il mio meccanismo secondo il quale vengono aggiunte soltanto parole che non figurano nel database.
Ecco risolto:
In MainActivity ho questo codice:
            @Override
            public void onClick(View view) {
                if (editText.getText()!=null){
                    Cursor crs=helper.query(editText.getText().toString());
                    crs.moveToFirst();
                    if(crs.getCount()==0){
                        helper.save(editText.getText().toString());
                    }
                    else{
                        helper.incrementa(editText.getText().toString());
                    }

                    editText.setText(null);
                }
            }
che in risposta al click del button mi seleziona un recordset dalla tabella del database.
Se questo recordset ha dimensioni zero, ossia se la parola non è presente in tabella, allora mette in opera il semplice metodo save() del database e salva la parola (ponendo nel campo NUMERO il valore di 1).
Altrimenti se le dimensioni del recordset sono di 1 (e non possono essere altre perché se la parola è già presente non viene mai aggiunta una seconda volta) esegue il metodo incrementa, che ha per parametro la parola stessa trovata nell'editText, del database.

Ed ecco il metodo del database che incrementa il campo NUMERO di una parola già presente.
    public void incrementa(String parola){
        SQLiteDatabase db=this.getWritableDatabase();
        db.execSQL("UPDATE TABELLA SET NUMERO = NUMERO +1 WHERE TESTO = '" + parola + "'");

    }
Qui ho avuto qualche difficoltà dovuta al fatto che non padroneggio alla perfezione l'SQL.
Praticamente il significato è "Aggiorna, nella tabella TABELLA, il campo numero mettendo il suo stesso valore incrementato di uno, là dove il campo TESTO contiene la parola portata come parametro".
E funziona.

Nessun commento:

Posta un commento