Il Forum è consultabile solo in modalità lettura. Per domande o consigli iscriviti al nostro GRUPPO FACEBOOK / COMMUNITY cliccando qui

Effettuare query di un database tramite una stringa.

Discussione in 'Development' iniziata da tank, 24 Nov 2012.

  1. tank

    tank Baby Droid

    Iscritto:
    14 Ott 2012
    Messaggi:
    13
    "Mi Piace":
    2
    Salve a tutti! Come da titolo, vorrei effettuare una query di un database tramite una stringa. Mi spiego: l'utente, in base a una scelta effettuata in uno spinner, deve effettuare una query in un database...quindi, l'item da ricercare nel database varia in base alla scelta dell'utente.

    La scelta tramite spinner va effettuata in un'activity a parte, quindi la stringa selezionata nello spinner va passata all'activity del database.
    Il passaggio di valori da un'activity a un'altra mi è chiara, tuttavia non so come impostare la query, dal momento che ogni tentativo (anche il più disperato) non è andato a buon fine... :(

    Vi posto un po' di codici...

    Il database.
    Codice:
    package com.android.myapp;
    
    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.view.View;
    import android.widget.AdapterView;
    
    public class DBProdotto {
    	SQLiteDatabase fDb;
        DbHelper fDbHelper;
        Context fContext;
        private static final String DB_NAME="dbProdotto";//nome del db
        private static final int DB_VERSION=2; //numero di versione del nostro db
        
       
        public DBProdotto(Context ctx2){
                fContext=ctx2;
                fDbHelper=new DbHelper(ctx2, DB_NAME, null, DB_VERSION);    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                fDb=fDbHelper.getWritableDatabase();
               
        }
       
        public void close(){ //chiudiamo il database su cui agiamo
                fDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento
    
       
        public void insertProdotto(String product, String periodo){ //metodo per inserire i dati
                ContentValues boh=new ContentValues();
                boh.put(ProdottoMetaData.product, product);
                boh.put(ProdottoMetaData.PERIODO, periodo);
                fDb.insert(ProdottoMetaData.DB_Prodotto, null, boh);
        }
    
       
        public Cursor fetchProdotto(){ //metodo per fare la query di tutti i dati
                return fDb.query(ProdottoMetaData.DB_Prodotto, null,null, null, null, null, null);              
        }
    \\########LA QUERY INCRIMINATA :D#################
        public Cursor fetchNomeproduct(String value){ //query product
            return fDb.query(ProdottoMetaData.DB_Prodotto, null, ProdottoMetaData.product + "=" + "'"+value+"'",null,null,null,null,null);              
    }
    \\#########################################
    
    	static class ProdottoMetaData {  // i metadati della tabella, accessibili ovunque
                static final String DB_Prodotto = "Prodotto";
                static final String ID = "_id";
                static final String product = "product";
                static final String PERIODO = "periodo";
        }
    
        private static final String DB_Prodotto_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProdottoMetaData.DB_Prodotto + " ("
                        + ProdottoMetaData.ID+ " integer primary key autoincrement, "
                        + ProdottoMetaData.product + " text not null, "
                        + ProdottoMetaData.PERIODO + " text not null); ";
        
        
    
    
        
    
    	private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db
    
                public DbHelper(Context context, String name, CursorFactory factory,int version) {
                        super(context, name, factory, version);
                }
    
    
    
    			@Override
                public void onCreate(SQLiteDatabase sdb) { //solo quando il db viene creato, creiamo la tabella
                        sdb.execSQL(DB_Prodotto_CREATE);
                        
                }
    
                @Override
                public void onUpgrade(SQLiteDatabase sdb, int oldVersion, int newVersion) {
                        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione
    
                }
    
        }
               
    
    }
    L'activity che utilizza il database.
    Codice:
    package com.android.myapp;
    
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Color;
    import android.graphics.PixelFormat;
    import android.graphics.Typeface;
    import android.graphics.drawable.GradientDrawable;
    import android.os.Bundle;
    import android.support.v4.widget.SimpleCursorAdapter;
    import android.util.Log;
    import android.view.WindowManager;
    import android.view.View.OnClickListener;
    import android.view.animation.Animation;
    import android.view.animation.AnimationUtils;
    import android.view.animation.TranslateAnimation;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ListView;
    import android.app.AlertDialog;
    import android.app.Dialog;
    
    public class DBprodottoActivity extends Activity {
    	
    	@Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.listview_dbprodotto);                
           
            ListView listaprodotto=(ListView)findViewById(R.id.listaprodotto);
           
            DBprodotto db=new DBprodotto(getApplicationContext());
            db.open();  //apriamo il db
           
           
          if(db.fetchprodotto().getCount()==0){//inserimento dati, solo se il db è vuoto
        	  db.insertprodotto("Abbonamento1","mensile");
        	  db.insertprodotto("Abbonamento2","annuale");
    	  db.insertprodotto("Abbonamento3","mensile");
    	  db.insertprodotto("Abbonamento4","settimanale");
              db.insertprodotto("Abbonamento5","annuale");
        	  
            }
           
           
    
          Cursor c=db.fetchprodotto(); // query
          Cursor c1=db.fetchNomeproduct("'"+value+"'"); // query
            startManagingCursor(c1);
    
           
           
            SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
                            this,
                            R.layout.riga_db_prodotto, //il layout di ogni riga
                            c1,
                            new String[]{DBprodotto.prodottoMetaData.FRUTTO},//questi colonne
                            new int[]{R.id.dbprodottoresult1});//in queste views
           
           
    
           
           
            listaprodotto.setAdapter(adapter); //la listview ha questo adapter
           
           
            //qui vediamo invece come reperire i dati e usarli, in questo caso li stampiamo in una textview
           
            int prodottoCol=c1.getColumnIndex(DBprodotto.prodottoMetaData.FRUTTO);
            int PeriodoCol=c1.getColumnIndex(DBprodotto.prodottoMetaData.PERIODO);//indici delle colonne
           
            
       
           
            db.close();
            
            
    
           
    
            getWindow().setFormat(PixelFormat.RGBA_8888);   //visto che usiamo i gradient, usiamo questo trick (vedi snippet forum)
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);  
           
            
           
           
            //animazioni in modo programmatico (vedi snippet forum)
            Animation a1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
            a1.setDuration(1000);
            a1.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
            listaprodotto.startAnimation(a1);
            //entra da sotto
           
           
            Animation a2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
            a2.setDuration(1000);
            a2.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
            listaprodotto.startAnimation(a2);
            //entra da sopra
           
           
        }
    	
    }
    
    L'activity dove viene gestito lo spinner.
    Codice:
    package com.android.myapp;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.Spinner;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class ConsumatorePage3 extends Fragment {
    	private Spinner spinner1, spinner2;
    	private Button spinnerbutton1, spinnerbutton2;
    	
       public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
          
          // fragment not when container null
          if (container == null) {
             return null;
          }
          // inflate view from layout
          View view = (LinearLayout)inflater.inflate(R.layout.consumatorepage3,container,false);
    
          spinner1 = (Spinner) view.findViewById(R.id.spinner1);
    	  spinner2 = (Spinner) view.findViewById(R.id.spinner2);
    	  final Activity activity = getActivity();
    	  spinnerbutton1 = (Button) view.findViewById(R.id.spinnerbutton1);
    	  
    	  spinnerbutton1.setOnClickListener(new OnClickListener() {
    	                @Override
    			public void onClick(View view) {
    
    				Intent intent = new Intent(activity,####ATTIVITA' CHE DEVE RICEVERE LA STRINGA####.class);
    				  intent.putExtra("com.android.myapp",String.valueOf(spinner1.getSelectedItem()));
    				  startActivity(intent);
    			}
    		});
    	  
          
          return view;
       }
       
    }
    Dunque...prima di tutto, come avrete visto in
    Codice:
    Intent intent = new Intent(activity,####ACTIVITY CHE DEVE RICEVERE LA STRINGA####.class);
    				  intent.putExtra("com.android.myapp",String.valueOf(spinner1.getSelectedItem()));
    				  startActivity(intent);
    non so quale activity deve ricevere la stringa dallo spinner. Di conseguenza, non so dove inserire quest'altro pezzo di codice che serve all'activity destinataria per reperire la stringa.
    Codice:
    public String value=getIntent().getExtras().getString("com.fullwipe.foodwise");
    E quindi non so come effettuare la query.
    Suggerimenti?
    Ringrazio anticipatamente!
     
  2. acer1629

    acer1629 Worker Droid

    Iscritto:
    22 Ago 2012
    Messaggi:
    113
    "Mi Piace":
    22
    Ciao

    al volo ti direi ... non puoi dichiarare la stringa come public nell'activity dove l'utente la genererà e richiamarla in quella del database facendo : ActivityPadre.stringa ?

    Cosi ti eviti i passaggi ... alla fine se è public la stringa viene vista da tutte le activity presenti in quel progetto.