Autore Topic: Cursore bloccato  (Letto 821 volte)

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Cursore bloccato
« il: 02 Settembre 2011, 17:18:06 CEST »
0
Ciao a tutti,
Ho iniziato da poco a studiare il sistema android. Ho un grosso problema che non riesco a risolvere.E' da 2 giorni che sto cercando di trovare una soluzione ma proprio non riesco a venirne a capo.
Ho realizzato un ContentProvider che gestisce dei dati memorizzati in un database SQLite.
Il problema si verifica nell'inserimento di una nuova riga all'interno del database.
Attraverso la pressione di un bottone  le informazioni che definiscono la nuova riga da aggiungere vengono inserite nel database e viene visualizzata una nuova schermata che mostra a video i dati relativi all'ultima riga appena inserita.
Nel momento in cui viene creato il database e viene creata la prima riga della tabella associata al db, le informazioni vengono visualizzate correttamente.
Ad un successivo inserimento di una nuova riga però la schermata mostra nuovamente le informazioni relative alla prima riga inserita.
Il cursore rimane quindi bloccato.
Eccovi qui di seguito i codici:

Evento pressione del pulsante per l'inserimento della nuova riga:
Codice (Java): [Seleziona]
public void onClick(View v)
    {
   
        if (v == btnAggiu)
        {
                categ= spin.getSelectedItem().toString();
               
              ContentValues values = new ContentValues();
              values.put(PoiProvider.NOME, titolo.getText().toString());
              values.put(PoiProvider.CATEGORIA, categ);
              values.put(PoiProvider.DESCRIZIONE, desc.getText().toString() );  
              values.put(PoiProvider.LATITUDINE, lati);
              values.put(PoiProvider.LONGITUDINE, longi);  
              values.put(PoiProvider.VIA, via.getText().toString());
              values.put(PoiProvider.CITTA, cit.getText().toString());
              values.put(PoiProvider.CAP, cap.getText().toString());
              values.put(PoiProvider.NAZIONE, naz.getText().toString());
             
             
             
              Uri uri = getContentResolver().insert(
                 PoiProvider.CONTENT_URI, values);
             
              values.clear();
             
              Intent i_InfoPoi= new Intent(this,InfoPoi.class);
              String pkg =getPackageName();
              i_InfoPoi.putExtra(pkg+".lat",lati);
              i_InfoPoi.putExtra(pkg+".lon",longi);
              startActivity(i_InfoPoi);
              finish();
        }
             
}


Schermata di visualizzazione delle informazioni inserite:
Codice (Java): [Seleziona]
public class InfoPoi extends Activity implements OnClickListener
{
       
        TextView inome,icat,idesc,ivia,iccn;
        Button botmap,botcanc;
        String lat,lon;
        private Cursor Poicurs=null;
       
       
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.poiinfo);
                 
                 inome= (TextView)findViewById(R.id.infonome);
                 icat= (TextView)findViewById(R.id.infocat);
                 idesc= (TextView)findViewById(R.id.infodesc);
                 ivia= (TextView)findViewById(R.id.infovia);
                 iccn= (TextView)findViewById(R.id.infoccn);
                 
                 botmap= (Button)findViewById(R.id.bottoneMap);
                 botmap.setOnClickListener(this);
                 botcanc= (Button)findViewById(R.id.cancPoi);
                 botcanc.setOnClickListener(this);
               
                 
                 Intent i_InfoPoi= getIntent();
                String pkg=getPackageName();
               
                lat= i_InfoPoi.getStringExtra(pkg+".lat");
                lon= i_InfoPoi.getStringExtra(pkg+".lon");
 

             
                  Poicurs = managedQuery(PoiProvider.CONTENT_URI,null,null,null,null);
               
                 
               
                 if (Poicurs.moveToLast())
                 {
                         
                         inome.setText(Poicurs.getString(Poicurs.getColumnIndex(PoiProvider.NOME)));
                         icat.setText(Poicurs.getString(Poicurs.getColumnIndex(PoiProvider.CATEGORIA)));
                         idesc.setText(Poicurs.getString(Poicurs.getColumnIndex(PoiProvider.DESCRIZIONE)));
                         ivia.setText(Poicurs.getString(Poicurs.getColumnIndex(PoiProvider.VIA)));
                         iccn.setText(Poicurs.getString(Poicurs.getColumnIndex(PoiProvider.CITTA)));
                         iccn.setText(Poicurs.getString(Poicurs.getColumnIndex(PoiProvider._ID)));
                 }
               
        }
       

P.S.Molto probabilmente troverete diversi errori nel codice postato.Ciò è dovuto alle mie scarse conoscenze in materia. Qualcuno mi può dare una mano? :-P
Grazie


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re: Cursore bloccato
« Risposta #1 il: 02 Settembre 2011, 18:14:20 CEST »
+1
Non credo che il metodo moveToLast effettivamente ti garantisca di prendere l'ultimo inserito. Dovresti ordinare i record...
Prova comunque a spostare tutto quel codice dall'onCreate all onResume... potrebbe essere che l'activity non venga distrutta.. 
Sent from my HTC Desire
« Ultima modifica: 02 Settembre 2011, 18:16:27 CEST da Ricky` »

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Cursore bloccato
« Risposta #2 il: 02 Settembre 2011, 18:35:37 CEST »
0
Quindi se ho capito bene,dovrei inserire una query di questo tipo:
Codice (Java): [Seleziona]
 Poicurs = managedQuery(PoiProvider.CONTENT_URI,null,null,null,"_ID ASC");Ma l'esecuzione di questa query mi garantisce che verrà sempre visualizzato l'ultimo elemento?
E poi mi sorge un altro dubbio:
E' corretto eseguire una managedQuery oppure è meglio richiamare il metodo getContentResolver().query(...) dato che si tratta di un content provider?

Offline Summ3r

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Mac OS X 10.6
Re:Cursore bloccato
« Risposta #3 il: 03 Settembre 2011, 10:48:27 CEST »
0
Perfetto! Ce l'ho fatta!
il problema stava proprio nell' ordinamento dei record.Facendo quindi una query ordinata in base al campo _ID la schermata mi visualizza sempre l'ultimo dato inserito.
L'activity viene distrutta nel momento in cui esco dalla schermata quindi l'idea di spostare il codice all'interno del metodo onResume()
non avrebbe risolto niente.
Grazie per l'aiuto!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Cursore bloccato
« Risposta #4 il: 03 Settembre 2011, 11:06:48 CEST »
0
L'activity viene distrutta nel momento in cui esco dalla schermata quindi l'idea di spostare il codice all'interno del metodo onResume()
non avrebbe risolto niente.

Ok, ma a meno che tu chiami esplicitamente il metodo finish() quando l'utente preme il tasto back non assumere che l'activity venga automaticamente distrutta ;)