Autore Topic: Effettuare query di un database tramite una stringa.  (Letto 668 volte)

Offline tank

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Effettuare query di un database tramite una stringa.
« il: 22 Novembre 2012, 17:44:26 CET »
0
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 (Java): [Seleziona]
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 (Java): [Seleziona]
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 (Java): [Seleziona]
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 (Java): [Seleziona]
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 (Java): [Seleziona]
public String value=getIntent().getExtras().getString("com.fullwipe.foodwise");
E quindi non so come effettuare la query.
Suggerimenti?
Ringrazio anticipatamente!

Offline tank

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: 0
    • Mostra profilo
Re:Effettuare query di un database tramite una stringa.
« Risposta #1 il: 26 Novembre 2012, 10:40:33 CET »
0
Vabè, ci sono riuscito...marco come topic risolto.