Id tabella database Android

di il
29 risposte

Id tabella database Android

Ciao, devo risolvere un problema con l'id di una tabella.
Dunque, se per esempio in una tabella ho 3 records inseriti, avrò come id 1,2,3.

L'id è univoco, quindi se elimino un record, ad esempio quello con id 1, poi inserisco un nuovo record, avrò come id: 2,3,4. Se elimino il 3, avrò 2,4,5 e così via...

Il problema è qui, se elimino e poi aggiungo un record voglio avere sempre 1,2,3.

Consigli??

29 Risposte

  • Re: Id tabella database Android

    Scusa ma per cosa ti serve? Il problema è che se tu hai le righe 1,2,3 e poi cancelli la 1 e la 3, quando poi rifai nuovi inserimenti dovresti saltare il 2. Quindi in generale non è facile come cosa.
    Inoltre dalla documentazione:
    SQLite keeps track of the largest ROWID that a table has ever held using the special SQLITE_SEQUENCE table. The SQLITE_SEQUENCE table is created and initialized automatically whenever a normal table that contains an AUTOINCREMENT column is created. The content of the SQLITE_SEQUENCE table can be modified using ordinary UPDATE, INSERT, and DELETE statements. But making modifications to this table will likely perturb the AUTOINCREMENT key generation algorithm. Make sure you know what you are doing before you undertake such changes.
    Quindi puoi modificare la tabella SQLITE_SEQUENCE, ma se poi fai danni sqlite non mette le cose a posto
  • Re: Id tabella database Android

    Ti spiego bene cosa devo fare, magari riesci a consigliarmi altre strade..

    La View viene popolata tramite una Lista che a sua volta riceve i dati dal db.
    Ad ogni colonna della View corrisponde un giorno (la prima colonna OGGI, la seconda DOMANI e così via in base agli operatori presenti nel db.

    Quindi l'operatore che ha come id 1, sarà visualizzato nella prima colonna, l'operatore che ha l'id 2 sarà visualizzato nella seconda colonna ecc.....

    Attualmente ho inserito un semplice if-else per provare e tutto funziona (VEDI SCREENSHOOT).

    Però se vado ad eliminare un operatore e poi ne inserisco un altro, al nuovo vengono assegnati automaticamente gli eventi dell'operatore eliminato e questo non deve accadere.
    Spero di essere stato chiaro

    La lista:
    
     @Override
        public List<WeekViewEvent> onMonthChange(int newYear, int newMonth) {
            //converto il calendario per la query
            SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd");
            final String strDate = simpleFormat.format(calendar.getTime());
            // Populate the week view with some events.
            List<WeekViewEvent> events = new ArrayList<WeekViewEvent>();
            SQLiteDatabase db = new DatabaseHelper(getActivity()).getReadableDatabase();
    
    String tabella_op = "SELECT m.id_operatore, " +
                    "m.data, " +
                    "m.ora_inizio, " +
                    "m.minuti_inizio, " +
                    "m.ora_fine, " +
                    "m.minuti_fine, " +
                    "m.id_servizio, " +
                    "c._id, " +
                    "c.nome, " +
                    "c.cognome, " +
                    "o.nome, " +
                    "s.colore " +
                    "FROM Movimenti m " +
                    "LEFT JOIN Clienti c ON (m.id_cliente = c._id) " +
                    "LEFT JOIN Servizi s ON (m.id_servizio = s._id) " +
                    "LEFT JOIN Operatori o ON (o._id = m.id_operatore) " +
                    "AND m.data LIKE '" + strDate + "'";
    
    Cursor cur = db.rawQuery(tabella_op, null);
            while (cur.moveToNext()) {
                Calendar startTime = Calendar.getInstance();
    
    id_operator = cur.getString(0);
                dat = cur.getString(1);
                ora_iniz = cur.getInt(2);
                minuto_iniz = cur.getInt(3);
                ora_fin = cur.getInt(4);
                minuto_fin = cur.getInt(5);
                id_servizio = cur.getString(6);
                id_client = cur.getString(7);
                nome_cliente = cur.getString(8);
                cognome_cliente = cur.getString(9);
                nome_operatore = cur.getString(10);
                colore_serv = cur.getInt(11);
    
     if(id_operator.equals("1")){
                    startTime = Calendar.getInstance();
                }else if(id_operator.equals("2")){
                    startTime.add(Calendar.DATE, 1);
                }else if(id_operator.equals("3")){
                    startTime.add(Calendar.DATE, 2);
                }
    
                //inizio
                startTime.set(Calendar.HOUR_OF_DAY, ora_iniz);
                startTime.set(Calendar.MINUTE, minuto_iniz);
                startTime.set(Calendar.MONTH, newMonth - 1);
                startTime.set(Calendar.YEAR, newYear);
                //fine
                Calendar endTime = (Calendar) startTime.clone();
                endTime.set(Calendar.HOUR_OF_DAY, ora_fin);
                endTime.set(Calendar.MINUTE, minuto_fin);
                //endTime.set(Calendar.MONTH, newMonth-1);
                //endTime.set(Calendar.YEAR, newYear);
                String mese = String.valueOf(newMonth - 1);
                Log.d("mese", mese);
    
                //setto la weekview
                WeekViewEvent event = new WeekViewEvent(1, getEventTitle(startTime), startTime, endTime);
                event.setColor(colore_serv);
                events.add(event);
            }
            cur.close();
            db.close();
            return events;
        }
    

    Allegati:
    12301_dc341f62132e12d570e2d68564132612.png
    12301_dc341f62132e12d570e2d68564132612.png
  • Re: Id tabella database Android

    Mmm non credo di aver capito: ogni colonna equivale a un giorno (e fin qui ok), ma poi non capisco perché come intestazione delle colonne metti i nomi degli operatori
  • Re: Id tabella database Android

    Questa è una libreria, che al posto degli operatori inseriti da me aveva i giorni.
    Per non rifare tutto da zero (lavoro enorme per me), ho fatto si che al posto dei giorni nell'header delle colonne inserisco gli operatori, quindi per assegnare a ciascun operatore i sui eventi devo aggiungere un giorno al calendario.
    
               if(id_operator.equals("1")){
                    startTime = Calendar.getInstance();
                }else if(id_operator.equals("2")){
                    startTime.add(Calendar.DATE, 1);
                }else if(id_operator.equals("3")){
                    startTime.add(Calendar.DATE, 2);
                }
    
    Funziona bene, l'unico problema riguarda è quello che ti dicevo prima, cioè se elimino un operatore e poi ne inserisco uno nuovo gli vengono assegnati gli eventi di quello eliminato.
  • Re: Id tabella database Android

    Credo di aver capito: in pratica la view nasce mostrando i giorni ma tu vuoi associare le colonne agli operatori giusto?
  • Re: Id tabella database Android

    Si
  • Re: Id tabella database Android

    Boh secondo me non ti conviene intervenire sull'id del DB perché rischi di far danni.
    Potresti mettere gli ID in un array e usare l'indice come se fosse il giorno: indice 0=oggi, 1=domani, ecc.. Fra l'altro ti direbbe in automatico quanti giorni sommare
  • Re: Id tabella database Android

    Aspetta..riesci a fare un esempio?
  • Re: Id tabella database Android

    Beh un esempio è difficile da fare, però il succo è: lasci gli id così come sono, se anche si tratta di numeri sparsi non importa. Dal DB prelevi gli operatori che vuoi visualizzare e li metti in un array o una lista o comunque una struttura dati che ti permette di formare un ordinamento. Ordini i vari operatori sulla base dell'id (in modo da visualizzarli ordinati poi). Infine usi la posizione della struttura dati come addendo per la data.

    Quindi il primo operatore (quello con id più basso) occuperà la posizione 0 della struttura dati (posizione che equivale al giorno OGGI), il secondo operatore sarà in posizione 1 (cioè OGGI+1), e così via. L'ultimo operatore avrà posizione N (cioè OGGI+N)
  • Re: Id tabella database Android

    Dunque, sono un pò "impicciato", ho fatto così ma aggiunge i giorni in modo corretto
    
                int size = id_op.length;//array id operatori
                for(int i = 0; i< size; i++){
                    if(size == 0){
                        startTime = Calendar.getInstance();
                    }else{
                        startTime.add(Calendar.DATE, 1);
                }
                }
    
  • Re: Id tabella database Android

    Supponendo che tu abbia fatto bene il resto, allora il codice sarebbe:
    
                int size = id_op.length;//array id operatori
                for(int i = 1; i< size; i++){
                        // Qua devi fare qualcosa del tipo startTime = operatori[i].getStartTime();
                        ....
                        startTime.add(Calendar.DATE, i);
                }
    
    Dove startTime dovrebbe essere il tempo di inizio dell'i-esimo operatore
  • Re: Id tabella database Android

    Della ha scritto:



    
             
                        // Qua devi fare qualcosa del tipo startTime = operatori[i].getStartTime();
                      
    
    c'è un pò di confusione, operatori non esiste, l'array è id_op ed ottengo la posizione dei dati in questo modo:
    
                int size = id_op.length;//array id operatori
                for(int i = 0; i< size; i++){
                    if(size == 0){
                        startTime = Calendar.getInstance();
                    }else{                    
                        startTime.add(Calendar.DATE, i);
                    }
                }
    
    il problema è :
     if(size == 0){
                        startTime = Calendar.getInstance();
                    }else{                    
                        startTime.add(Calendar.DATE, i);
                    }
  • Re: Id tabella database Android

    evans ha scritto:


    c'è un pò di confusione
    Infatti ti ho detto di fare "qualcosa del tipo" pensavo che ad ogni operatore avessi associato un oggetto Date.

    Comunque il succo rimane lo stesso, l'operazione da fare è quella
  • Re: Id tabella database Android

    Non ho capito.
Devi accedere o registrarti per scrivere nel forum
29 risposte