Autore Topic: Ritornare Cursore (o contuto db) da AutoCompleteTextView  (Letto 570 volte)

Offline OllO

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Ritornare Cursore (o contuto db) da AutoCompleteTextView
« il: 02 Gennaio 2016, 15:34:13 CET »
0
Ciao a tutti e buon anno.

Avrei un codice così:

Codice (Java): [Seleziona]
        AutoCompleteTextView autorif = (AutoCompleteTextView) findViewById(R.id.autoComplete);

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, db.getDove());
        autorif.setAdapter(adapter);


        autorif.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l)
            {
                valore = (String) adapterView.getItemAtPosition(i);
            }
        }

Tutto ok perchè l'atocomplete funziona, ritornandomi tutto l'elenco dei valori di una colonna di una tabella in sqlite:

Codice (Java): [Seleziona]
public List<String> getDove()
    {

        SQLiteDatabase db=helper.getReadableDatabase();
        Cursor crs=db.query("dove", null, null, null, null, null, null);

       List<String> res=new ArrayList<String>();

        while(crs.moveToNext())
        {
            String tmp=crs.getString(crs.getColumnIndex("rif_nome"));
            res.add(tmp);

        }
        crs.close();
        return res;
    }

Ora la questione è che la tabella "dove" ha altri campi, "_id", "rif_nome", "posizione" ecc.. ecco, come posso estrapolare gli altri dati della riga, selezionata in fase di autocoplete? In altre parole in questo momento ho solo correttamente la variabile "valore" che altro non è che la selezione dell'autocomplete; se volessi avere anche "_id" di questo "rif_nome"? immagino di dover lavorare direttamente con il cursore?
Ma come?

Grazie a tutti


Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #1 il: 03 Gennaio 2016, 12:25:21 CET »
0
Il "dove" cosa corrisponde? Ora come ora non ricordo l'ordine dei parametri del metodo .query(). Però se selezioni tutto da una tabella allora il cursore ritorna tutti i campi di ogni record

Post unito: 03 Gennaio 2016, 12:27:40 CET
Scusa. Dove è la tabella. Se te fai cursor.getString(int index) puoi estrapolare tutti i campi come già fai per rif_nome.
L'ordine corrisponde a come sono stati creati i campi nel DB.
« Ultima modifica: 03 Gennaio 2016, 12:27:40 CET da tonno16, Reason: Merged DoublePost »

Offline OllO

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #2 il: 03 Gennaio 2016, 15:36:01 CET »
0
Ottimo, grazie della risposta.
I campi della tabella "dove" sono un int (_id) e 2 stringhe (rif_nome e tipo); ma al di la di questo, sulla gestione del cursore all'interno della funzione, nessun dubbio.. il mio problema, è la gestione dell arrayadapter in relazione al l'autocompletetextview. Cioè ad "autorif" devo dare delle stringhe che tiro fuori dalla funzione... Dovrei gestire un dato diverso da stringa, fuori dalla funzione? ma a quel punto ho paura di non riuscire a gestire l'atocomplete...
Sojo stato chiaro? Non credo  :-(

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #3 il: 03 Gennaio 2016, 17:06:20 CET »
0
Non ho capito niente

Offline OllO

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #4 il: 03 Gennaio 2016, 17:22:29 CET »
0
Bene, riprovo a spiegarmi.
Tu mi consigliavi di lavorare all'interno della funzione "getDove", direttamente sul corsore, giusto? Ed invece di tirare fuori solo "rif_nome" tirare fuori anche altre informazioni, giusto?
Il mio problema era capire come ritornare questi altri dati, visto che sto utilizzando "ArrayAdapter<String>". Cioè più che lavorere sul "getDove", devo forse partire con un adapter diverso?

Grazie ancora!

Offline tonno16

  • Utente storico
  • *****
  • Post: 1169
  • Respect: +56
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #5 il: 03 Gennaio 2016, 19:46:18 CET »
0
Devi avere un ArrayAdapter<Qualcosa>

Dove qualcosa è un oggetto. Devi quindi creare un custom ArrayAdapter

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #6 il: 04 Gennaio 2016, 12:27:09 CET »
0
Ma così stai facendo la query sul database nel thread della GUI o sbaglio?
Non è una buona tecnica. Dovresti recuperare i dati in un thread separato e poi aggiornare l'adapter.

Offline OllO

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #7 il: 04 Gennaio 2016, 15:30:51 CET »
0
Grazie anche a te iClaude.
Posto un po' di progressi, dovesse servire a qualcuno..diciamo che dopo aver cercato e smacchinato, "ho prodotto" questo codice:

Codice (Java): [Seleziona]
//questa mettiamo che la MainActivity

final AutoCompleteTextView autorif = (AutoCompleteTextView) findViewById(R.id.autoComplete);

        CursorAdapter adapter = new CursorAdapter(this, db.getDove(), false) {
            @Override
            public View newView(Context context, Cursor cursor, ViewGroup parent) {
                View v= LayoutInflater.from(context).inflate(android.R.layout.simple_list_item_1,null);
                return v;
            }

            @Override
            public void bindView(View view, Context context, Cursor cursor) {

                autorif.setText(cursor.getString(cursor.getColumnIndex("rif_nome")));


            }
        };

        autorif.setAdapter(adapter);


ok, manca l'onclick ma la lista mi appare, grazie alla:

Codice (Java): [Seleziona]
//questa è una richiesta del DbManager

public Cursor getDove()
    {

        SQLiteDatabase db=helper.getReadableDatabase();
        Cursor crs= db.query("dovelo", null, null, null, null, null, null);

        return crs;
    }

Sembrerebbe risolto ma, funziona bene per un numero ridotto di righe del db, ne ho circa 300 ed il telefono resta semplicemente impallato.

Quindi iClaude mi sembra correttissima la tua osservazione, è che ho dei limiti sulla programmazione e, ripeto, chiaro cosa intendi un po' meno sulla realizzazione :(. Tra l'atro (non di esecuzione di altro thred si parla..) ma ho trovato anche questo link How to use AutoCompleteTextView and SimpleCursorAdapter together in Android | mekya anche se devo ancora capire se mi può essere utile..

Ma mi domando, estrapolazioni come quella che sto facendo (praticamente interrogazione di un db, visualizzando il contenuto di un suo campo in un textviewautocomplete, estrapolando poi gli altri dati della riga selezionata) altri come la eseguono?

Grazie ancora!

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #8 il: 04 Gennaio 2016, 16:06:24 CET »
0
Nel tuo caso,  essendo il db locale e la query relativamente veloce,  puoi usare un semplice AsyncTask. Se googoli trovi parecchie guide veloci. Bastano poche righe di codice.
In ogni caso la programmazione multithreading in Android è fondamentale, quindi fossi in te approfondirei l'argomento.

Offline OllO

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #9 il: 04 Gennaio 2016, 23:49:55 CET »
0
Ma giusto per capire, AsyncTask per popolare una autocomplete?

Mi permetto poi di ripostare la domanda: estrapolazioni come quella che sto facendo (praticamente interrogazione di un db, visualizzando il contenuto di un suo campo in un textviewautocomplete, estrapolando poi gli altri dati della riga selezionata) altri come la eseguono?

Grazie

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Ritornare Cursore (o contuto db) da AutoCompleteTextView
« Risposta #10 il: 05 Gennaio 2016, 08:44:17 CET »
0
Le operazioni su file vanno eseguite di regola in un thread separato.
La procedura è questa: recuperi i dati dal database in un thread separato (il metodo doInBackground dell'AsyncTask) e poi aggiorni l'adapter coi dati recuperati (in onPostExecute dell'AsyncTask).
Altrimenti rischi di bloccare la UI.