Autore Topic: Sqlite e android domanda semplice  (Letto 563 volte)

Offline xixietto

Sqlite e android domanda semplice
« il: 25 Gennaio 2016, 13:30:40 CET »
0
salve, android studio mi da errore xk ci sono due parametri
qual'è la formula corretta?
Codice (Java): [Seleziona]
Cursor g2 = db.rawQuery("SELECT * FROM unioneingredienti WHERE idingredienti =? AND idfiglio=?", selectionArg2,selectionArg3);

Offline NetGEL

  • Utente normale
  • ***
  • Post: 196
  • Respect: +9
    • Google+
    • Mostra profilo
  • Play Store ID:
    NetGEL
Re:Sqlite e android domanda semplice
« Risposta #1 il: 25 Gennaio 2016, 14:13:08 CET »
0
Ciao,
tu potresti fare:

Codice: [Seleziona]

String query = "SELECT * FROM unioneingredienti WHERE idingredienti = " + selectionArg2 + " AND idfiglio = " + selectionArg3";
Cursor g2= db.rawQuery(query, null);


Questo è un modo

Offline xixietto

Re:Sqlite e android domanda semplice
« Risposta #2 il: 25 Gennaio 2016, 14:16:26 CET »
0
 
Codice (Java): [Seleziona]
String[] args = { g1.getString(0),valore_editText_nome};//_id dell'ingrediente in tabella ingredienti//_id della salsiccia in tabella salsiccia
                                          Cursor g2 = db.rawQuery("SELECT * FROM unioneingredienti WHERE idingredienti =? AND idfiglio=?", args);
invece se facessi in questo modo?

Offline NetGEL

  • Utente normale
  • ***
  • Post: 196
  • Respect: +9
    • Google+
    • Mostra profilo
  • Play Store ID:
    NetGEL
Re:Sqlite e android domanda semplice
« Risposta #3 il: 25 Gennaio 2016, 14:18:54 CET »
0
Va benissimo. Il modo che ti ho scritto io è la maniera più semplice. Quello che scrivi tu è equivalente ma in effetti è meglio a livello stilistico  ;-)

Offline xixietto

Re:Sqlite e android domanda semplice
« Risposta #4 il: 25 Gennaio 2016, 14:19:35 CET »
0
ti ringrazio :)

Offline NetGEL

  • Utente normale
  • ***
  • Post: 196
  • Respect: +9
    • Google+
    • Mostra profilo
  • Play Store ID:
    NetGEL
Re:Sqlite e android domanda semplice
« Risposta #5 il: 25 Gennaio 2016, 14:31:27 CET »
0
Di nulla

Offline iClaude

  • Utente normale
  • ***
  • Post: 177
  • Respect: +11
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S5
  • Sistema operativo:
    Windows 10
Re:Sqlite e android domanda semplice
« Risposta #6 il: 25 Gennaio 2016, 15:24:39 CET »
0
Ciao,
tu potresti fare:

Codice: [Seleziona]

String query = "SELECT * FROM unioneingredienti WHERE idingredienti = " + selectionArg2 + " AND idfiglio = " + selectionArg3";
Cursor g2= db.rawQuery(query, null);


Questo è un modo

Attenzione che questo codice non è sicuro in quanto potenzialmente può produrre sql injection:
https://it.m.wikipedia.org/wiki/SQL_injection

ad esempio se l'utente inserisce x selectionArg2 "nothing; DROP TABLE *;"

Sempre meglio usare i ? e un array di parametri.

Offline NetGEL

  • Utente normale
  • ***
  • Post: 196
  • Respect: +9
    • Google+
    • Mostra profilo
  • Play Store ID:
    NetGEL
Re:Sqlite e android domanda semplice
« Risposta #7 il: 25 Gennaio 2016, 15:30:43 CET »
0
Si hai ragione. E' possibile. Dipende da come e dove usi quelle righe di codice.

Offline xixietto

Re:Sqlite e android domanda semplice
« Risposta #8 il: 25 Gennaio 2016, 23:47:11 CET »
0
scusate, h un'altro problema
perchè la mia listview quando si aggiorna.. visualizza solo l'ultimo valore?
Codice (Java): [Seleziona]
   public void Aggiornare(){
        //  adapter_MainActivity.notifyDataSetChanged();
         lista_ingredienti_salsiccia.clear();
        adapter_lista_nuovo = new Adapter_lista_nuovo(this, R.layout.row_nuovo, lista_ingredienti_salsiccia);
         String valore_editText_nome1 = nome.getText().toString();
          valore_editText_nome1 = valore_editText_nome1.substring(0,1).toUpperCase() + valore_editText_nome1.substring(1,valore_editText_nome1.length()).toLowerCase();

        String[] arg = {valore_editText_nome1};//nome della salsiccia
         Log.d("numero righe", valore_editText_nome1);

         Cursor c = db.rawQuery("SELECT * FROM figlio WHERE nome=?", arg);
         while (c.moveToNext()) {
             String[] arg1 = {c.getString(0)};//id della salsiccia
            Cursor c1 = db.rawQuery("SELECT * FROM unioneingredienti WHERE idfiglio=?", arg1);//tutti i campi dove id figlio è uguale a quell'id
             if(c1.getCount()==0){
             }

             else {
                while(c1.moveToNext()){
                   String[] arg2 = {c1.getString(4)};
                    Cursor c2 = db.rawQuery("SELECT * FROM ingredienti WHERE _id=?", arg2);//nome ingrediente nella salsiccia
                    while(c2.moveToNext()){
                      for (int i = 0; i < c2.getCount(); i++) {
                         lista_ingredienti_salsiccia.put(i, new CustomObject(c2.getString(1), c1.getInt(1)));
                           Log.d("numero righe", (c2.getString(1) + " " + c1.getInt(1)));

                      }
                    }
                }
             }
         }
              adapter_lista_nuovo.clear();
               adapter_lista_nuovo.notifyDataSetChanged();
              adapter_lista_nuovo.add(lista_ingredienti_salsiccia);
              adapter_lista_nuovo.notifyDataSetChanged();
              lista.setAdapter(adapter_lista_nuovo);
              lista.getAdapter().getCount();
              Log.d("numero righe", String.valueOf(lista.getAdapter().getCount()));



     }

adapter
Codice (Java): [Seleziona]
    class CustomObject {
        private String text1;
        private int text2;

        public String getText1(){

            return this.text1;
        }
        public void setText1(String text1){

            this.text1= text1;
        }

        public int getText2(){
            return this.text2;
        }
        public void setText2(int text2){
            this.text2= text2;
        }

        public CustomObject(String text1, int text2) {
            this.text1 = text1;
            this.text2 = text2;
        }



    }




    public class Adapter_lista_nuovo extends BaseAdapter {
        private ArrayList mapData;
        Context context;
        int layoutResourceId;

        Holder1 holder1;

        public Adapter_lista_nuovo(Context context, int layoutResourceId, Map<Integer, CustomObject> arList) {
            this.layoutResourceId = layoutResourceId;
            this.context = context;

            mapData = new ArrayList();
            mapData.addAll(arList.entrySet());
        }

        @Override
        public int getCount() {
            return mapData.size();
        }


        @Override
        public Map.Entry<Integer, CustomObject> getItem(int position) {
            return (Map.Entry) mapData.get(position);
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View view, ViewGroup parent) {
            if(view == null) {
                holder1 = new Holder1();

                LayoutInflater inflater = ((Activity)context).getLayoutInflater();
                view = inflater.inflate(layoutResourceId, parent, false);

                holder1.textView = (TextView)view.findViewById(R.id.textViewList);
                holder1.textView2 = (TextView)view.findViewById(R.id.textViewnum);

                view.setTag(holder1);
            } else {
                holder1 = (Holder1)view.getTag();
            }

            Map.Entry<Integer, CustomObject> item = getItem(position);
            holder1.textView.setText(item.getValue().getText1());
            holder1.textView2.setText(String.valueOf(item.getValue().getText2()));

            return view;
        }
        public void add(Map<Integer, CustomObject> map) {
            mapData.addAll(map.entrySet());
        }
        public void clear() {
            mapData.clear();
        }

    }
    class Holder1 {
        TextView textView, textView2;
    }

Post unito: [time]26 Gennaio 2016, 14:23:07 CET[/time]
ho caricato tre ingredienti per quella salsiccia è ho notato tramite il log che lista.getAdapter().getCount();
mi da come risultato 1
anzicchè 3
dovrebbe essere questo il problema?

Post unito: 26 Gennaio 2016, 16:31:11 CET

mando la soluzione.. forse è da migliorare
Codice (Java): [Seleziona]
public void Aggiornare(){
        //  adapter_MainActivity.notifyDataSetChanged();
         lista_ingredienti_salsiccia.clear();
        adapter_lista_nuovo = new Adapter_lista_nuovo(this, R.layout.row_nuovo, lista_ingredienti_salsiccia);
         String valore_editText_nome1 = nome.getText().toString();
          valore_editText_nome1 = valore_editText_nome1.substring(0,1).toUpperCase() + valore_editText_nome1.substring(1,valore_editText_nome1.length()).toLowerCase();

        String[] arg = {valore_editText_nome1};//nome della salsiccia
         Log.d("nome della salsiccia", valore_editText_nome1); //funziona
         Cursor c = db.rawQuery("SELECT * FROM figlio WHERE nome=?", arg);
         while (c.moveToNext()) {
             Log.d("id salsiccia", (c.getString(0)));//funziona
             String[] arg1 = {c.getString(0)};//id della salsiccia

             Cursor c1 = db.rawQuery("SELECT * FROM unioneingredienti WHERE idfiglio=?", arg1);//tutti i campi dove id figlio è uguale a quell'id
             Log.d("ingredienti salsiccia", String.valueOf((c1.getCount())));
             if(c1.getCount()==0){
             }

             else {
                 for (int i = 0; i < c1.getCount(); i++) {
                     while(c1.moveToNext()){
                   String[] arg2 = {c1.getString(4)};//id ingrediente salsiccia
                    Log.d("id ingrediente", c1.getString(4));
                    Cursor c2 = db.rawQuery("SELECT * FROM ingredienti WHERE _id=?", arg2);//nome ingrediente nella salsiccia
                            while(c2.moveToNext()){
                                lista_ingredienti_salsiccia.put(i++, new CustomObject(c2.getString(1), c1.getInt(1)));
                            Log.d("i", String.valueOf(i));
                            Log.d("nome e valore", (c2.getString(1) + " " + c1.getInt(1)));

                      }
                    }
                }
                 adapter_lista_nuovo.clear();
                 adapter_lista_nuovo.notifyDataSetChanged();
                 adapter_lista_nuovo.add(lista_ingredienti_salsiccia);
                 adapter_lista_nuovo.notifyDataSetChanged();
                 lista.setAdapter(adapter_lista_nuovo);
                 lista.getAdapter().getCount();
                 Log.d("numero righe", String.valueOf(lista.getAdapter().getCount()));
             }
         }
era il contatore a nn funzionare correttamente cosi ho inserito i++ qui
                                lista_ingredienti_salsiccia.put(i++, new CustomObject(c2.getString(1), c1.getInt(1)));
 dite di aver fatto bene?
« Ultima modifica: 26 Gennaio 2016, 16:31:11 CET da xixietto, Reason: Merged DoublePost »