Autore Topic: CICLO WHILE INFINITO  (Letto 1532 volte)

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
CICLO WHILE INFINITO
« il: 03 Gennaio 2013, 14:13:50 CET »
0
Salve ragazzi, ho un ciclo while che risulta essere infinito:

Codice (Java): [Seleziona]
 SQLiteDatabase database = ( new DatabaseHelper(CT).getReadableDatabase());
                    Cursor cursor = database.query(TABLE_NAME, new String[] {"domain", "description", "link"},
                            "domain like " + "'%"+params[0]+"%'", null, null, null, null);
                    if( cursor != null ){
                       
                        LinkedHashSet<String> set = new LinkedHashSet<String>();
                        if( cursor.moveToLast() )  {
                                do{
                                        Taga = cursor.getString(cursor.getColumnIndex("domain"));
                                        Tagb = cursor.getString(cursor.getColumnIndex("description"));
                                        Tagc = cursor.getString(cursor.getColumnIndex("link"));
                                   
                                    if (Taga != null)
                                        set.add(Taga);
                                   
                                    if (Tagb != null)
                                        set.add(Tagb);
                                   
                                    if (Tagc != null)
                                        set.add(Tagc);
                                   
                                    Log.e("PPP", Taga.toString());
                                Log.e("OOO", Tagb.toString());
                                Log.e("III", Tagc.toString());
                                   
                                }
                        while(cursor.moveToPrevious());
                                  }
                    }

                    cursor.close();
                   
                   
                   
                   
                 }
                   
                               
il codice effettua la query, dopidichè cicla il cursor finchè trova corrispondenze, sfortunatamente però il ciclo risulta essere infinito.
Grazie per le risposte.
Domani Smetto.

Offline criss74

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: +6
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Sony Xperia U - Huawei ideos
  • Play Store ID:
    Il Conte
  • Sistema operativo:
    Debian 7.0 (Testing)
Re:CICLO WHILE INFINITO
« Risposta #1 il: 03 Gennaio 2013, 14:31:20 CET »
+2
Per forza è infinito!
Scusa, tu prima porti il cursore alla fine del recordset e poi fai una while spostandolo di volta in volta al record precedente.
Quest'ultima operazione risulterà semre TRUE perché quando sarai arrivato al primo record la moveToPrevious() viene eseguita correttamente ma ti porta sempre al primo record.

Non so se c'è uno specifico motivo per cui Tu usi questa sequenza, ma normalmente per scorrere un recordset si porta il cursore prima il cursore in fondo (moveToLast()) per inizializzare correttamente il recordset, dopodiché fai un moveToFirst() per portarlo all'inizio e poi nella while metti un moveToNext() per scorrere tutti i record.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:CICLO WHILE INFINITO
« Risposta #2 il: 03 Gennaio 2013, 15:22:52 CET »
0
Ho modificato il codice come da te consigliato:

Codice (Java): [Seleziona]
SQLiteDatabase database = ( new DatabaseHelper(CT).getReadableDatabase());
                    Cursor cursor = database.query(TABLE_NAME, new String[] {"domain", "description", "link"},
                            "domain like " + "'%"+params[0]+"%'", null, null, null, null);
                    if( cursor != null ){
                       
                        LinkedHashSet<String> set = new LinkedHashSet<String>();
                        if( cursor.moveToLast() )
                       
                        {
                               
                                cursor.moveToFirst();
                                do{
                                       
                                         Taga.add (cursor.getString(cursor.getColumnIndex("domain")));
                                       
                                   
                                    if (Taga != null)
                                        set.addAll(Taga);
                                       
                                   
                                       
                                   
                                   
                                   
                                }
                        while(cursor.moveToNext());
                   
                        }
                    }

                    Log.e("PPP", Taga.toString());
                   
                    cursor.close();
                   
                   
                   
                   
                 }

ma il risultato è sempre lo stesso in quanto il Log mi mostra moltissimi risultati mentre ne dovrebbe mostrare soltanto 5.

Codice: [Seleziona]

01-03 14:17:40.862: E/PPP(311): [www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooplus.it, www.zooroyal.de]



come posso effettuare il ciclo in modo che prenda soltanto una volta ciascun valore, senza ripeterli più e più volte?
Grazie
Domani Smetto.

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:CICLO WHILE INFINITO
« Risposta #3 il: 03 Gennaio 2013, 15:39:13 CET »
+1
nella condizione del while metti -------> !cursor.isAfterLast()

e il moveToNext mettilo dentro al ciclo

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:CICLO WHILE INFINITO
« Risposta #4 il: 03 Gennaio 2013, 16:00:19 CET »
0
In questo modo?
Codice (Java): [Seleziona]
  SQLiteDatabase database = ( new DatabaseHelper(CT).getReadableDatabase());
                    Cursor cursor = database.query(TABLE_NAME, new String[] {"domain", "description", "link"},
                            "domain like " + "'%"+params[0]+"%'", null, null, null, null);
                    if( cursor != null ){
                       
                        LinkedHashSet<String> set = new LinkedHashSet<String>();
                        if( cursor.moveToLast() )
                       
                        {
                               
                                cursor.moveToFirst();
                                do{
                                       
                                         Taga.add (cursor.getString(cursor.getColumnIndex("domain")));
                                       
                                   
                                    if (Taga != null)
                                        set.addAll(Taga);
                                   
                                   
                                    cursor.moveToNext();
                                       
                                   
                               
                                   
                                }
                        while(!cursor.isAfterLast());
                                 
                      }
                    }

                    Log.e("PPP", Taga.toString());
                   
                    cursor.close();
                   

Il risultato è rimasto invariato  :-(
Domani Smetto.

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:CICLO WHILE INFINITO
« Risposta #5 il: 03 Gennaio 2013, 16:05:41 CET »
+1
prova per curiosità a mettere, sempre nella condizione del while:

Codice (Java): [Seleziona]
!cursor.isFirst()

Offline criss74

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: +6
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Sony Xperia U - Huawei ideos
  • Play Store ID:
    Il Conte
  • Sistema operativo:
    Debian 7.0 (Testing)
Re:CICLO WHILE INFINITO
« Risposta #6 il: 03 Gennaio 2013, 16:09:07 CET »
+1
Ricontrolla bene tutto il flusso di esecuzione dei cicli, ad un primo sguardo direi che devi spostare la cursor.moveNext() fuori dalla if ma sempre dentro la do, altrimenti appena incontri un record per cui è valida la condizione Taga = null non avanza di record e non ti esce più dal loop.

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:CICLO WHILE INFINITO
« Risposta #7 il: 03 Gennaio 2013, 16:13:10 CET »
+1
ma è già fuori dall'if in quanto non usa le parentsi graffe. Ora però rileggendo bene alla fine lui ti esegue il log finale, quindi vuol dire che esce dal ciclo.

subito dopo il cursor != null, prova a fare un bel

Codice (Java): [Seleziona]
Log.d("TAG",""+cursor.getCount());
così vediamo quanti record sono

EDIT: curiosità personale ----> param[0] per caso è = zoo
« Ultima modifica: 03 Gennaio 2013, 16:17:16 CET da agenio »

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:CICLO WHILE INFINITO
« Risposta #8 il: 03 Gennaio 2013, 17:26:30 CET »
0
Vi ringrazio per la gentilezza, e mi scuso il problema era solo mio in quanto non cancellavo il db nel quale effettuo la query, quindi trovata molti corrispondenze in quanto nel db esse c'erano. Scusatemi!
Se volete continuare ad aiutarmi ne sarei molto grato.
Infatti adesso devo visualizzare i dati che prelevo col cursor in una seconda activity.
Mi sono basato sul tutorial  Topic: [facile] Passaggio di dati tra un'activity ed un'altra http://www.anddev.it/index.php/topic,104.0.html
ma ho il seguente problema: The method putExtra(String, boolean) in the type Intent is not applicable for the arguments (String, List<String>)
nel seguente codice
Codice (Java): [Seleziona]
 final Intent intent = new Intent(getApplicationContext(), Activity2.class);

                 //per rendere univoci i nomi delle chiavi passate
                 String pkg=getPackageName();  
                         
                 //inseriamo i dati nell'intent  
                 intent.putExtra(pkg+".Domain", Taga);              
                 
                 

                 Button button=(Button)findViewById(R.id.btnGet);
                 button.setOnClickListener(new OnClickListener() {
                       
                        public void onClick(View v) {
                               
                                //facciamo partire l'activity
                                startActivity(intent);
                        }
                 });
                 
                 }
sapete darmi dei suggerimenti? e Grazie ancora  :-)
Domani Smetto.

Offline agenio

  • Utente junior
  • **
  • Post: 77
  • Respect: +11
    • Google+
    • Mostra profilo
  • Dispositivo Android:
    Moto G
  • Sistema operativo:
    Windows 8.1
Re:CICLO WHILE INFINITO
« Risposta #9 il: 03 Gennaio 2013, 17:46:12 CET »
+1
usa putStringArrayListExtra

magari prima dovrai convertire (non so se basta fare un cast) la List in ArrayList<String>

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:CICLO WHILE INFINITO
« Risposta #10 il: 04 Gennaio 2013, 11:18:33 CET »
0
usa putStringArrayListExtra

magari prima dovrai convertire (non so se basta fare un cast) la List in ArrayList<String>

Ti ringrazio agenio per il suggerimento che va benissimo  :-)
Grazie a questa seconda Activity riesco infatti a mostrare a schermo i domain trovati sul db dal cursor.
Codice (Java): [Seleziona]
public class Activity2 extends Activity {
       
        private ListView ListView;     
        List<String> DomainArray= new ArrayList<String>();
        private ArrayAdapter arrayAdapter;

       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.act2);
               
                // l'intent di questa activity
                Intent intent=getIntent();
               
                String pkg=getPackageName();
               
                 // Inizializzo il Listview
        ListView = (ListView) findViewById(R.id.ListView);
       
       
        DomainArray.addAll (intent.getStringArrayListExtra(pkg+".Domain"));
       
     
        arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, DomainArray);

        // Uso il SetAdapter
        ListView.setAdapter(arrayAdapter);

         
       
    }

}

Adesso mi trovo di fronte ad un altro problema però, come posso fare per mostrare a schermo non sono domain ma anche un altro campo del db (description) sulla stessa riga come questo esempio:



e secondo problema come faccio a rendere ogni riga visualizzata contenente questi due testi (domain e description) un link, cioè in modo che cliccandoci mi si apra il browser e mi vada su una pagina web.
Grazie per i suggerimenti.
Domani Smetto.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:CICLO WHILE INFINITO
« Risposta #11 il: 04 Gennaio 2013, 17:06:19 CET »
0
Nessuno sa darmi una risposta? Come faccio ad assegnare ad ogni riga del ListView un link, in modo che cliccando su tale riga venga indirizzato tramite il browser al pagina web?
Che cosa devo mettere in sintassi
Codice (Java): [Seleziona]
ListView.setOnItemClickListener(new OnItemClickListener() {

??????

}
Domani Smetto.

Offline pupi93

  • Utente junior
  • **
  • Post: 54
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Huawei Ideos
  • Sistema operativo:
    Ubuntu 10.04
Re:CICLO WHILE INFINITO
« Risposta #12 il: 10 Gennaio 2013, 23:27:36 CET »
0
Se ho capito bene, per il primo problema prova:

Codice (Java): [Seleziona]
android.R.layout.simple_list_item_2
in questa maniera

Codice (Java): [Seleziona]
  lv.setAdapter(new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor,
                        new String[]{ "città","provincia" },
                        new int[] { android.R.id.text1, android.R.id.text2}));

questo non fa altro, una volta effettuata la query, di prendere le stringhe citta e provincia e metterle nello stesso item della listview secondo il layout.simple_list_item_2.

Fai sapere se funziona.
Per il secondo problema non so aiutarti! :(

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:CICLO WHILE INFINITO
« Risposta #13 il: 16 Gennaio 2013, 17:19:12 CET »
0
Domani Smetto.