Autore Topic: Gestione dati con DB  (Letto 2411 volte)

Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Gestione dati con DB
« il: 28 Febbraio 2014, 16:30:58 CET »
0
Ciao a tutti raga..
Ho bisogno del vostro aiuto e anche di alcuni piccoli chiarimenti...
In pratica devo sviluppare un app che gestisce un db scrivibile e leggibile... innanzi tutto volevo sapere se è possibile, nel codice sorgente, al momento di scrivere l'app, inserire un db già preconfigurato, così che non lo devo scrivere ( ma penso che sia impossibile una cosa del genere ).
Inoltre vorrei avere dei chiarimenti per la gestione del database. Ho letto varie guide, compresa anche quella di Qlimax, che mi è sembrata la più semplice, e tutte sembrano diverse, quindi volevo sapere se esiste un metodo più giusto per la gestione del db.
 

Post unito: 01 Marzo 2014, 00:52:21 CET
Ragazzi come per ottenere il massimo tra gli id di una tabella è giusto implementare il metodo così :
Codice: [Seleziona]
public static Cursor getMaxID (SQLiteDatabase db){
      return db.rawQuery("SELECT MAX(ID), FROM ID", null);
}
una volta effettuata la query (indipendentemente se la mia funziona) si memorizza il risultato sull'oggetto Cursor come posso fare ad estrarre l'ID massimo se questo è presente ?
« Ultima modifica: 01 Marzo 2014, 00:52:21 CET da Dreker, Reason: Merged DoublePost »

Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Gestione dati con DB
« Risposta #1 il: 06 Marzo 2014, 12:02:56 CET »
0
Ciao Dreker,spero di aver capito la tua domanda...
Citazione
..è possibile, nel codice sorgente, al momento di scrivere l'app, inserire un db già preconfigurato, così che non lo devo scrivere ( ma penso che sia impossibile una cosa del genere ).

Automaticamente se non esiste il database, quindi non è mai stato istanziato, Android esegue il metodo onCreate.
Nell'onCreate possiamo mettere, attraverso l'uso di SQL classico, la creazione del DB come meglio crediamo.
Per esempio:
Codice (Java): [Seleziona]
 @Override
                public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                        _db.execSQL("CREATE TABLE IF NOT EXISTS PRODUCTS_TABLE
                                              (ID integer primary key autoincrement,  
                                                PRODUCT_NAME  text not null);"
);
                }

E poi...
Codice (Java): [Seleziona]
public static Cursor getMaxID (SQLiteDatabase db){
      return db.rawQuery("SELECT MAX(ID), FROM ID", null);
}

Dovrebbe essere così:

Codice (Java): [Seleziona]
public static Cursor getMaxID (SQLiteDatabase db){
      return db.rawQuery("SELECT MAX(ID) FROM NOME_TABELLA", null);
}

Come ultima cosa, l'oggetto cursor lo puoi utilizzare cosi:

Codice (Java): [Seleziona]
Cursor c = tuoClasseDB.getMaxID(SQLiteDatabaseCheGliPassi);

while (c.moveToNext()) {
        int numMaxId = c.getInt(1);
}

Spero di aver risposto alle tue domande..  ;-)

Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #2 il: 06 Marzo 2014, 13:38:59 CET »
0
Ciao MattiaP, sei stato chiarissimo... L'unico dubbio che mi rimane è sulla clausola, se così possiamo intenderla, per quanto riguarda la chiave primaria autoincrementata, come funziona ? Prende semplicemente l' ID numerico e lo incremta di una unità quando ne creo uno nuovo ? Poi volevo chiederti anche se l'oggetto cursor viene gestito tipo un array, quindi lo posso scorrere e prendere quello che mi serve ?

Inviato dal mio GT-I9070 utilizzando Tapatalk


Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Gestione dati con DB
« Risposta #3 il: 06 Marzo 2014, 13:52:01 CET »
0
Esattamente,
proprio con "primary key autoincrement" stiamo dicendo che il valore deve essere univoco e che si autoincrementa.

 
Citazione
Poi volevo chiederti anche se l'oggetto cursor viene gestito tipo un array, quindi lo posso scorrere e prendere quello che mi serve ?

Si questo è possibile proprio facendo cosi:

Codice (Java): [Seleziona]
while (c.moveToNext()) { //finchè "c" è valorizzato cicla
        int numMaxId = c.getInt(1);
        //se hai un campo text basta fare c.getString(2); //2 indica la posizione della colonna

}

Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #4 il: 06 Marzo 2014, 13:58:38 CET »
0
Ma com'è la struttura interna ? E come vengono gestiti i records ?

Inviato dal mio GT-I9070 utilizzando Tapatalk


Offline MattiaP

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: 0
    • mattia-panerotti
    • Mostra profilo
    • Panerotti Mattia
  • Dispositivo Android:
    Note N7000
  • Play Store ID:
    mattia panerotti
  • Sistema operativo:
    OS X Mavericks
Re:Gestione dati con DB
« Risposta #5 il: 06 Marzo 2014, 14:27:30 CET »
0
Supponiamo di dover leggere i dati da una query così fatta:

Select nome,cognome,eta from persona;
Supponiamo che la query restituisca i seguenti dati:
|   0     |   1      |   2  |
 mario    rossi     19
  luca     armo     31
ecc ecc


L'oggetto Cursor sarà cosi strutturato:
Cursor:
  • =mario [1]=rossi [2]=19     ----> posizione 0
  • [0]=luca [1]=armo   [2] = 31     ----> posizione 1

    ecc ecc


    con il while, noi cicliamo.

Codice (Java): [Seleziona]
while (c.moveToNext()) { //Inizialmente ci troviamo in posizione 0.
        String nome = c.getString(0); // in posizione 0 nome = mario ecc
        String cognome = c.getString(1);
        int eta = c.getInt(2);

}

Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #6 il: 06 Marzo 2014, 14:29:38 CET »
0
Perfetto ho capito tutto... ;)

Inviato dal mio GT-I9070 utilizzando Tapatalk


Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #7 il: 20 Marzo 2014, 12:58:58 CET »
0
Ultima cosa... quando devo aggiornare dei campi, è giusto richiamare un metodo (scritto da me) di questo genere ?
Codice: [Seleziona]
public static void updateValues (SQLiteDatabase db, String str){
         ContentValues v = new ContentValues();
         v.put(CAMPO, str);
         db.insert(TABELLA, null, v);
}

Offline mirkus87

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Play Store ID:
    Mirko Vitiello
  • Sistema operativo:
    Windows 7
Re:Gestione dati con DB
« Risposta #8 il: 20 Marzo 2014, 13:20:28 CET »
0
Per aggiornare un campo di un record esistente dovresti usare "db.update", perchè altrimenti "db.insert" andrebbe sempre ad inserire nuovi record.

n.b. se la tabella da aggiornare contiene + record ma tu devi aggiornare un solo record devi anche aggiungere le condizioni per aggiornare i record corretti

Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #9 il: 20 Marzo 2014, 15:14:07 CET »
0
OK ora vedo... Grazie per la dritta ;)

Inviato dal mio GT-I9070 utilizzando Tapatalk


Offline pup3770

  • Utente junior
  • **
  • Post: 89
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s3
  • Sistema operativo:
    Android
Re:Gestione dati con DB
« Risposta #10 il: 25 Marzo 2014, 12:18:38 CET »
0
Ciao Ragazzi, mi accodo.

Ho un problemino.. premetto che ancora non mastico bene i DB di Android. Sui DB in generale ho lavorato.

Ho creato un'app che mi consente di inserire: nome, cognome e e-mail di ogni utente. Mi conta il numero di registrazioni che ho. Adesso vorrei stampare tutti i dati.

Per recuperare il numero di record inseriti utilizzo:
Codice (Java): [Seleziona]
 private void recuperaNumeroRecord() {
        //Chiediamo l'accesso al db
        SQLiteDatabase db = mMioDbHelper.getReadableDatabase();
 
        //Query per recuperare il numero di righe presenti nel db
        final String sql = "SELECT COUNT(*) FROM rubrica";
 
        Cursor c = db.rawQuery(sql, null);
 
        if(c.moveToFirst()) {
            final TextView tView = (TextView) this.findViewById(R.id.mainTextViewNumeroRecord);
            tView.setText(c.getString(0));
        }
    }

Questo funziona correttamente.

Mentre sto avendo problemi nel realizzare il metodo per visualizzare tutti i dati. Provando a visualizzare solo i nomi, ho fatto diverse prove (giocando anche con gli indici, esempio: moveToFirst(), moveToLast(), moveToNext() come nell'esempio (vedi sopra)):
Codice (Java): [Seleziona]
private void recuperaNome() {
        //Chiediamo l'accesso al db
        SQLiteDatabase db = mMioDbHelper.getReadableDatabase();

      //Query per recuperare il numero di righe presenti nel db
        final String sql = "SELECT nome FROM rubrica";
       
        Cursor c = db.rawQuery(sql, null);

        if(c.moveToFirst()) {
            final TextView tView = (TextView) this.findViewById(R.id.vediNome);
            tView.setText(c.getString(0));
           
        }  
       
    }

Così mi visualizza giustamente solo il "primo" perché ho messo "moveToFirst()"; ma anche cambiandolo o facendo cicli non cambia molto. L'unica cosa che cambia è che se metto "moveToLast()" giustamente mi stampa l'ultimo. Quindi il DB sembra essere correttamente popolato.

Considerate che nel layout ho come "TextView":
Codice (XML): [Seleziona]
<TextView
       android:id="@+id/vediNome"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="" />

Dove sbaglio???

Considerate che i dati vengono inseriti così:
Codice (Java): [Seleziona]
public class MainActivity extends Activity {
    //Variabile per la gestione del database
    private MioDbHelper mMioDbHelper = null;
    private EditText mEditNome;
    private EditText mEditCognome;
    private EditText mEditEmail;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //Inizializiamo la variabile per poter gestire il database
        mMioDbHelper = new MioDbHelper(getApplicationContext());
 
        //Recupero il numero di record presenti nel database
        recuperaNumeroRecord();
 
        //Campi
        mEditNome = (EditText) this.findViewById(R.id.mainEditTextNome);
        mEditCognome = (EditText) this.findViewById(R.id.mainEditTextCognome);
        mEditEmail = (EditText) this.findViewById(R.id.mainEditTextEmail);
 
        //Aggiungi Record
        Button button = (Button) this.findViewById(R.id.mainButtonAggiungi);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //Query di inserimento
                ContentValues contentValues = new ContentValues();
 
                contentValues.put("nome", mEditNome.getText().toString());
                contentValues.put("cognome", mEditCognome.getText().toString());
                contentValues.put("email", mEditEmail.getText().toString());
 
                //Accedo al database in scrittura
                SQLiteDatabase db = mMioDbHelper.getWritableDatabase();
                db.insert("rubrica", null, contentValues);    //Inserisco i dati
 
                //Pulisco i campi
                mEditCognome.setText("");
                mEditEmail.setText("");
                mEditNome.setText("");
                mEditNome.requestFocus();
 
                Toast.makeText(getApplicationContext(), "Nuovo record aggiunto", Toast.LENGTH_SHORT).show();
 
                //Aggiorno il numero dei record presenti nel database
                recuperaNumeroRecord();
                             
            }
        });
    }

Attendo un vostro gentile aiuto

Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #11 il: 25 Marzo 2014, 12:25:41 CET »
0
Ciao pup3770, se ho capito bene sia il problema, che i DB in android, per poter visualizzare tutti i record devi fare in modo che il Cursor c si sposti in avanti, con il metodo moveToNext() ( mi sembra sia questo ) e poi ad ogni spostamento fai leggere i dati ad una textView che accodi ai precedenti... Farlo in questo modo dovrebbe essere semplicissimo, poi per gestire le cose in maniera più efficace dovresti chiedere a qualcuno che ne mastica più di me riguardo android xD

Inviato dal mio GT-I9070 utilizzando Tapatalk


Offline pup3770

  • Utente junior
  • **
  • Post: 89
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy s3
  • Sistema operativo:
    Android
Re:Gestione dati con DB
« Risposta #12 il: 25 Marzo 2014, 12:30:21 CET »
0
Grazie Dreker, si ho già provato come dici tu, infatti mi sembrava di aver subito trovato la soluzione ma non va. Ho provato anche a ciclare con
Codice: [Seleziona]
while al posto di
Codice: [Seleziona]
if ma nulla.
Tu dici:

Codice (Java): [Seleziona]
private void recuperaNome() {
        //Chiediamo l'accesso al db
        SQLiteDatabase db = mMioDbHelper.getReadableDatabase();

      //Query per recuperare il numero di righe presenti nel db
        final String sql = "SELECT nome FROM rubrica";
       
        Cursor c = db.rawQuery(sql, null);

     
        //if(c.moveToFirst()) {
       
        if(c.moveToNext()){
                final TextView tView = (TextView) this.findViewById(R.id.vediNome);
                tView.setText(c.getString(0));      
        }
       
       
    } //fine metodo recuperaNome()

???

Il problema persiste. Sicuramente sbaglio a lavorare con gli indici o forse ho sbagliato nel creare gli inserimenti nel DB.

Tu cosa stavi facendo nel DB? Nel senso, anche tu scrivi e leggi i dati? Se si, puoi gentilmente postare il codice per intero. Grazie

Offline mirkus87

  • Utente junior
  • **
  • Post: 56
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S2
  • Play Store ID:
    Mirko Vitiello
  • Sistema operativo:
    Windows 7
Re:Gestione dati con DB
« Risposta #13 il: 25 Marzo 2014, 12:42:35 CET »
0
Ma vorresti visualizzare tutti i nomi presenti nel tuo db in una lista?
Sicuramente il metodo while è corretto (altrimenti non itera) in ogni caso non ho capito come è composta l'activity in cui visualizzare i dati.
E' presente la listview? O stai gestendo tutto in una semplice textview?




Offline Bob91

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S Advance GT-I9070
  • Sistema operativo:
    Ubuntu 13.04
Re:Gestione dati con DB
« Risposta #14 il: 25 Marzo 2014, 12:51:21 CET »
0
Grazie Dreker, si ho già provato come dici tu, infatti mi sembrava di aver subito trovato la soluzione ma non va. Ho provato anche a ciclare con
Codice: [Seleziona]
while al posto di
Codice: [Seleziona]
if ma nulla.
Tu dici:

Codice (Java): [Seleziona]
private void recuperaNome() {
        //Chiediamo l'accesso al db
        SQLiteDatabase db = mMioDbHelper.getReadableDatabase();

      //Query per recuperare il numero di righe presenti nel db
        final String sql = "SELECT nome FROM rubrica";
       
        Cursor c = db.rawQuery(sql, null);

     
        //if(c.moveToFirst()) {
       
        if(c.moveToNext()){
                final TextView tView = (TextView) this.findViewById(R.id.vediNome);
                tView.setText(c.getString(0));      
        }
       
       
    } //fine metodo recuperaNome()

???

Il problema persiste. Sicuramente sbaglio a lavorare con gli indici o forse ho sbagliato nel creare gli inserimenti nel DB.

Tu cosa stavi facendo nel DB? Nel senso, anche tu scrivi e leggi i dati? Se si, puoi gentilmente postare il codice per intero. Grazie

Ovviamente ogni volta devi creare una nuova textView e legarla ad un altro id, forse è meglio se la crei direttamente dal sorgente java invece di farla da xml, così la integri nel ciclo, ad esempio
Codice (Java): [Seleziona]
while(c.movetoNext())                      // in questo caso se è l'ultimo elemento ti ritorna un errore e puoi uscire dal ciclo
             istruzione query
             crei la nuava text view, la metti (ad esempio) 5dp sotto quella precedente
             setti la stringa
}
una cosa del genere secondo me andrebbe bene


oppure un altra soluzione sarebbe di creare tutte le textview e le imposti su nascoste, e poi quando recuperi i dati li metti sulla textView con il relativo id, ad es. textView1, textView2, textView+x (con x intero da 1 a 1000), e li fai mostrare man mano che cicli