Non hai postato le costanti.![]()
Non hai postato le costanti.![]()
Questa è la classe che crea il mio database:
1
2import java.util.ArrayList;
3import java.util.Vector;
4
5
6import agenda.bean.LogSpesaBean;
7import android.content.ContentValues;
8import android.content.Context;
9import android.database.Cursor;
10import android.database.sqlite.SQLiteDatabase;
11import android.database.sqlite.SQLiteOpenHelper;
12import android.database.sqlite.SQLiteDatabase.CursorFactory;
13
14
15public class MyDatabase2 {
16
17SQLiteDatabase mDb;
18DbHelper mDbHelper;
19Context mContext;
20private static final String DB_NAME="lista_spesa1616";//nome del db
21private static final int DB_VERSION=1; //numero di versione del nostro db
22
23public MyDatabase2(Context ctx){
24mContext=ctx;
25mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION); //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)
26}
27
28public void open(){ //il database su cui agiamo è leggibile/scrivibile
29mDb=mDbHelper.getWritableDatabase();
30}
31
32public void close(){ //chiudiamo il database su cui agiamo
33mDb.close();
34}
35
36public SQLiteDatabase getDatabase()
37{
38return mDb;
39}
40
41
42
43//i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
44public void insertProduct(String IDARA, String NOMEAR, boolean NONCIBOAR, String URIIMGAR, boolean CHANGEDAR,long DATAA){ //metodo per inserire i dati
45ContentValues cv=new ContentValues();
46cv.put(ProductsMetaDataArt.PRODUCT_ID_KEY, IDARA);
47cv.put(ProductsMetaDataArt.PRODUCT_NOME_KEY, NOMEAR);
48cv.put(ProductsMetaDataArt.PRODUCT_NONCIBO_KEY, NONCIBOAR);
49cv.put(ProductsMetaDataArt.PRODUCT_CHANGED_KEY, CHANGEDAR);
50cv.put(ProductsMetaDataArt.PRODUCT_URIIMG_KEY, URIIMGAR);
51cv.put(ProductsMetaDataArt.PRODUCT_DATAA_KEY, DATAA);
52mDb.insert(ProductsMetaDataArt.PRODUCTS_TABLE, null, cv);
53}
54
55public void insertLogSpesa(int IDARL, int QUANTITA){ //metodo per inserire i dati
56ContentValues cv2=new ContentValues();
57cv2.put(ProductsMetaDataLog.PRODUCT_ID_KEY, IDARL);
58cv2.put(ProductsMetaDataLog.PRODUCT_QUANT_KEY, QUANTITA);
59mDb.insert(ProductsMetaDataLog.LOGSPES_TABLE, null, cv2);
60}
61
62
63//Metodo per cancellare tutte le righe della tabella logspesadb che deve essere sempre aggiornata
64public void deleteLogspesadb(){
65mDb.delete("logspesadb", null, null);
66}
67
68//Metodo per cancellare tutte le righe della tabella prodotti che deve essere sempre aggiornata
69public void deleteProdotti(){
70mDb.delete("prodotti", null, null);
71}
72
73//Metodo per cancellare tutte le righe della tabella prodotti che deve essere sempre aggiornata
74public void deleteLogAcquiestidb(){
75mDb.delete("logacquistidb", null, null);
76}
77
78//Metodo che fa la query per aggiornare una riga della tabella prodotti
79public void updateArticolodbRow(String IDARA, String NOMEAR, boolean NONCIBOAR, String URIIMGAR, boolean CHANGEDAR,long DATAA){
80ContentValues cv3=new ContentValues();
81cv3.put(ProductsMetaDataArt.PRODUCT_ID_KEY, IDARA);
82cv3.put(ProductsMetaDataArt.PRODUCT_NOME_KEY, NOMEAR);
83cv3.put(ProductsMetaDataArt.PRODUCT_NONCIBO_KEY, NONCIBOAR);
84cv3.put(ProductsMetaDataArt.PRODUCT_CHANGED_KEY, CHANGEDAR);
85cv3.put(ProductsMetaDataArt.PRODUCT_URIIMG_KEY, URIIMGAR);
86cv3.put(ProductsMetaDataArt.PRODUCT_DATAA_KEY, DATAA);
87mDb.update(ProductsMetaDataArt.PRODUCTS_TABLE, cv3, "IDARA=" + IDARA, null);
88
89}
90
91//Metodo che fa la query per aggiornare una riga della tabella logspesa
92//ed in particolare la quantità da comperare
93public void updateQuantita(int IDARL, int QUANTITA){
94ContentValues cv4=new ContentValues();
95cv4.put(ProductsMetaDataLog.PRODUCT_QUANT_KEY, QUANTITA);
96mDb.update(ProductsMetaDataLog.LOGSPES_TABLE, cv4, "IDARL=" + IDARL, null);
97
98}
99
100
101
102//metodo per fare la query di tutti i dati della tabella prodotti
103public Cursor fetchProducts(){
104return mDb.query(ProductsMetaDataArt.PRODUCTS_TABLE, null,null,null,null,null,null);
105}
106
107//metodo per fare la query di alcuni specificati elementi della tabella articolo e della tabella logspesadb dove prodotti.IDARA=logspesadb.IDARL
108//Con questa query creiamo la lista della spesa vera e propria
109public Cursor fetchProducts2(){
110return mDb.rawQuery("SELECT prodotti._id,logspesadb._id2,prodotti.NOMEAR,prodotti.URIIMG,logspesadb.QUANTITA,logspesadb.IDARL FROM prodotti,logspesadb WHERE prodotti.IDARA=logspesadb.IDARL", null);
111
112}
113
114//metodo per fare la query di tutti i dati della tabella logspesadb
115public Cursor fetchLog(){
116return mDb.query(ProductsMetaDataLog.LOGSPES_TABLE, null,null,null,null,null,null);
117}
118
119//metodo per fare la query di tutti i dati della tabella logacquistidb
120public Cursor fetchAcquisti(){
121return mDb.query(ProductsMetaDataAcq.LOGACQ_TABLE, null,null,null,null,null,null);
122}
123
124//TABELLE DATABASE E LORO CREAZIONE----------------------------------------------------------
125
126// i metadati della tabella prodotti, accessibili ovunque
127static class ProductsMetaDataArt {
128static final String PRODUCTS_TABLE = "prodotti";
129static final String ID = "_id";
130static final String PRODUCT_ID_KEY = "IDARA";
131static final String PRODUCT_NOME_KEY = "NOMEAR";
132static final String PRODUCT_NONCIBO_KEY = "NONCIBOAR";
133static final String PRODUCT_CHANGED_KEY = "CHANGEDAR";
134static final String PRODUCT_URIIMG_KEY = "URIIMG";
135static final String PRODUCT_DATAA_KEY = "DATAA";
136
137
138}
139
140// i metadati della tabella logspesadb, accessibili ovunque
141static class ProductsMetaDataLog {
142static final String LOGSPES_TABLE = "logspesadb";
143static final String ID = "_id2";
144static final String PRODUCT_ID_KEY = "IDARL";
145static final String PRODUCT_QUANT_KEY = "QUANTITA";
146
147
148}
149
150// i metadati della tabella logaquistidb, accessibili ovunque
151static class ProductsMetaDataAcq {
152static final String LOGACQ_TABLE = "logacquistidb";
153static final String ID = "_id3";
154static final String PRODUCT_ID_KEY = "IDARTICOLOACQUISTATO";
155static final String PRODUCT_TIMESTAMPLONG_KEY = "TIMESTAMPLONG";
156static final String PRODUCT_TIMESTAMPSTRING_KEY = "TIMESTAMPSTRING";
157
158}
159
160
161
162//codice sql di creazione della tabella articoli
163private static final String PRODUCTS_TABLE_CREATE_ARTICOLI = "CREATE TABLE IF NOT EXISTS "
164+ ProductsMetaDataArt.PRODUCTS_TABLE + " ("
165+ ProductsMetaDataArt.ID+ " integer primary key autoincrement, "
166+ ProductsMetaDataArt.PRODUCT_ID_KEY + " integer not null, "
167+ ProductsMetaDataArt.PRODUCT_NOME_KEY + " text not null, "
168+ ProductsMetaDataArt.PRODUCT_URIIMG_KEY + " text not null, "
169+ ProductsMetaDataArt.PRODUCT_CHANGED_KEY + " boolean, "
170+ ProductsMetaDataArt.PRODUCT_DATAA_KEY + " long, "
171+ ProductsMetaDataArt.PRODUCT_NONCIBO_KEY + " boolean);";
172
173
174//codice sql di creazione della tabella logspesadb
175private static final String LOGSPES_TABLE_CREATE_LOGSPESA = "CREATE TABLE IF NOT EXISTS "
176+ ProductsMetaDataLog.LOGSPES_TABLE + " ("
177+ ProductsMetaDataLog.ID+ " integer primary key autoincrement, "
178+ ProductsMetaDataLog.PRODUCT_ID_KEY + " integer not null, "
179+ ProductsMetaDataLog.PRODUCT_QUANT_KEY + " string not null);";
180
181
182
183//codice sql di creazione della tabella logacquistidb
184private static final String LOGACQ_TABLE_CREATE_ACQUISTI = "CREATE TABLE IF NOT EXISTS "
185+ ProductsMetaDataAcq.LOGACQ_TABLE + " ("
186+ ProductsMetaDataAcq.ID+ " integer primary key autoincrement, "
187+ ProductsMetaDataAcq.PRODUCT_ID_KEY + " integer not null, "
188+ ProductsMetaDataAcq.PRODUCT_TIMESTAMPSTRING_KEY + " string not null, "
189+ ProductsMetaDataAcq.PRODUCT_TIMESTAMPLONG_KEY + " longer not null);";
190
191
192//classe che ci aiuta nella creazione del db
193private class DbHelper extends SQLiteOpenHelper {
194
195public DbHelper(Context context, String name, CursorFactory factory,int version) {
196super(context, name, factory, version);
197}
198
199
200//solo quando il db viene creato, creiamo la tabella
201
202public void onCreate(SQLiteDatabase _db) {
203_db.execSQL(PRODUCTS_TABLE_CREATE_ARTICOLI);
204_db.execSQL(LOGSPES_TABLE_CREATE_LOGSPESA);
205_db.execSQL(LOGACQ_TABLE_CREATE_ACQUISTI);
206}
207
208
209//qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app,
210//il db cambia numero di versione
211
212public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
213
214
215}
216
217
218
219
220
221}
222
223
224}
225
All'interno dell'activity alle colonne del db mi ricollego cosi:
81
2Cursor f = db2.fetchProducts2();
3startManagingCursor(f);
4f.moveToPosition(posizione);
5
6int mIdIndex = f.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);
7int mQtaIndex = f.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
8
dimmi pure se sono stato esaudiente o meno
ti ringrazio ciao
Si, pero pensavo ad un altro errore invece è tutto giusto (salvo che non mi sia scappato qualcosa)...
Riproviamo ancora con il MyAdapter, prova a cambiarlo cosi:
codice://GESTIONE MYADAPTER class MyAdapter extends ResourceCursorAdapter { // private int mIdIndex; private int mNameIndex; private int mUriIndex; private int mQtaIndex; public MyAdapter(Context context, Cursor cur) { super(context, R.layout.product, cur); } @Override public View newView ( Context context, Cursor cur, ViewGroup parent ) { LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); return li.inflate(R.layout.product, parent, false); } @Override public void bindView(View view, Context context, Cursor cur) { //TextView idAr = ( TextView ) view.findViewById( R.id.Idar ); TextView nameAr = ( TextView ) view.findViewById( R.id.Nomear ); TextView qtaAr = ( TextView ) view.findViewById( R.id.Qtaar ); ImageView imageAr = (ImageView) view.findViewById(R.id.ImageArticolo); //mIdIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_ID_KEY); mNameIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY); mUriIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY); mQtaIndex = cur.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY); //idAr.setText( cur.getString( mIdIndex ) ); nameAr.setText( cur.getString( mNameIndex ) ); qtaAr.setText( cur.getString( mQtaIndex ) ); imageAr.setImageURI(Uri.parse(cur.getString( mUriIndex ))); if(Integer.parseInt(cur.getString(mQtaIndex))==0){ ((LinearLayout)findViewById(R.id.layoutarticoli)).setBackgroundResource(R.color.primo); } } } //Fine class MyAdapter extends ResourceCursorAdapter //FINE GESTIONE MYADAPTER
azzarola non funziona ancora...nemmeno così...mi sa che ci rinuncio e vado di eliminazione della riga con quantità uguale a zero..non so come mai ma con i cursor sclera e mi fa lo scherzetto di cambiare lo sfondo ad un item della listview diverso una volta che scrollando la lista vado sull'elemento con quantità uguale a zero...per eliminare l'elemento dalla listview hai qualche idea? mi spiace che ti sto facendo sclerare su sta cosa..cmq grazie 1000 per l'aiuto che mi stai dando...
La ListView ricicla le view che visualizza man mano che si scorre (è una ottimizzazione per evitare di allocare centinaia di oggetti uguali) per questo motivo settando su un elemento uno sfondo di un colore diverso succede che scorrendo si vedano altri elementi diversi colorati lo stesso.
Mi sembra che ci sia qualche metodo da invocare sulla ListView per cambiarne il comportamento e bypassare questa cosa però non ricordo (non ne ho avuto bisogno finora).
Questo forse può essere un punto di partenza:
ListView Backgrounds: An Optimization | Android Developers
In quell'articolo spiega tutt'altra cosa.
E' vero che la listview ricicla le view che escono dallo schermo, ma in questo caso i valori li ri-inserisce, anche perchè le textview hanno il testo giusto.
Eh, sì, lo so, ma non trovo l'articolo giusto, mi sembra che sia dello stesso autore.
Comunque è esattamente come dici te, i valori vengono visualizzati corretti, ma alcune cose come appunto i background restano settati anche per altri item, l'ho sperimentato pure io, ma poi ho cambiato implementazione e
non ho più avuto bisogno di colorare gli item diversi...
Io credo che procederò nel seguente modo:
avendo a disposizione un database SQLite con la tabella che contiene le quantità degli articoli che sono in lista della spesa (cioè che sono da comperare) vado a verificare se la quantità di un articolo raggiunge quantità=0 ed elimino (facendo un delete) la riga corrispondente dalla tabella relativa di modo che così facendo, quando subito dopo il delete ripasso il nuovo cursore con la query all'adapter, non vedo più l'articolo con quantità uguale a zero, ma tale articolo lo vedrò nella listview (a parte apribile dal menu) degli articoli che sono fuori lista della spesa che possono essere anche loro acquistati....cosa ne dite???
grazie di tutto ciao!
...non riesco ad andare a fare la verifica se la quantità di un prodotto è andata a zero...questo è il codice java che gestisce gli onclick sulla listview...
881
2AdapterView.OnItemClickListener mItemListener = new OnItemClickListener() {
3public void onItemClick(AdapterView<?> adapter, View v,int pos,long id) {
4
5//String st = "Clicked POS="+pos+" ID="+id;
6//Toast.makeText(getApplicationContext(),st,Toast.LENGTH_SHORT).show();
7
8posizione = pos;
9db2.open();
10Cursor r = db2.fetchProductsInLista();
11startManagingCursor(r);
12r.moveToPosition(pos);
13adaptatore.notifyDataSetChanged();
14
15int mNameIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_NOME_KEY);
16int mUriIndex = r.getColumnIndex( MyDatabase2.ProductsMetaDataArt.PRODUCT_URIIMG_KEY);
17
18ImageView image = new ImageView(activity);
19AlertDialog.Builder builder = new AlertDialog.Builder(activity);
20
21String s = r.getString(mUriIndex).substring(8);
22s=s.replaceAll("%20", " ");
23String myJpgPath = s;
24BitmapFactory.Options options = new BitmapFactory.Options();
25options.inSampleSize = 2;
26Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
27image.setImageBitmap(bm); //Sostituisci la tua bitmap
28builder.setTitle("Conferma Acquisto");
29builder.setIcon(R.drawable.carrello);
30builder.setView(image);
31
32
33builder.setNegativeButton("Annulla", new DialogInterface.OnClickListener() {
34public void onClick(DialogInterface dialog, int id) {
35dialog.cancel();
36}
37});
38
39builder.setMessage("Vuoi acquistare una confezione di "+r.getString(mNameIndex)+" ?").setCancelable(false);
40builder.setPositiveButton("Conferma", new DialogInterface.OnClickListener() {
41public void onClick(DialogInterface dialog, int id) {
42
43db2.open();
44Cursor f = db2.fetchProductsInLista();
45startManagingCursor(f);
46f.moveToPosition(posizione);
47
48int mIdIndex = f.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_ID_KEY);
49int mQtaIndex = f.getColumnIndex( MyDatabase2.ProductsMetaDataLog.PRODUCT_QUANT_KEY);
50
51
52//Creiamo il progress dialog
53View v = new View(activity);
54manageProgress2(v);
55
56CreateData dataac = new CreateData();
57
58db2.insertLogAcquisti(Integer.parseInt(f.getString(mIdIndex)), dataac.getLongerData(), dataac.getStingData());
59db2.updateQuantita(Integer.parseInt(f.getString(mIdIndex)), Integer.parseInt(f.getString(mQtaIndex))-1);
60
61
62if(Integer.parseInt(f.getString(mQtaIndex))==0){
63//Cancelliamo prodotto con quantità=0 dalla tabella logspesadb e questo dovrà comparire
64//nella tabella degli articoli fuori lista.
65Log.i("ID_ARTICOLO CON QUANTITA NULLA: ",f.getString(mIdIndex));
66
67}
68
69boolean b = f.requery();
70Log.i("REQUERY?", String.valueOf(b));
71adaptatore = new MyAdapter(activity,f);
72adaptatore.notifyDataSetChanged();
73((ListView)findViewById(R.id.productsLv)).setAdapter(adaptatore);
74
75
76
77db2.close();
78dialog.cancel();
79}
80});
81
82builder.create().show();
83db2.close();
84}
85};
86((ListView)findViewById(R.id.productsLv)).setOnItemClickListener(mItemListener);
87
88
non riesco a capire come mai non mi entra in questo if
81
2if(Integer.parseInt(f.getString(mQtaIndex))==0){
3//Cancelliamo prodotto con quantità=0 dalla tabella logspesadb e questo dovrà comparire
4//nella tabella degli articoli fuori lista.
5Log.i("ID_ARTICOLO CON QUANTITA NULLA: ",f.getString(mIdIndex));
6
7}
8
io qui vorrei andare a eliminare dal db nella tabella logspesadb l'oggetto che ha quantità = 0 che poi facendo subito la f.requery(); dovrebbe scomparire dalla listview degli oggetti in lista spesa ed andare nella lista degli articoli fuori lista spesa....non capisco perchè non mi entri nell'if...eppure il cursor è settato a "posizione" cioè la posizione
dell'elemento a cui faccio l'onclick...
grazie in anticipo per l'aiuto...
Ultima modifica di sangio85; 11-11-10 alle 18:28