Autore Topic: Accedere al database SQLite  (Letto 3924 volte)

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Accedere al database SQLite
« il: 09 Maggio 2010, 23:07:32 CEST »
0
Buona sera a tutti,
ho un problema nello scrivere il metodo per visualizzare i dati contenuti di una tabella del mio DB SQLite.

Inanzitutto per l'inserimento ho creato un metodo in cui vengono lette le stringhe inserite negli EditText e queste vengono memorizzate in questo modo:
Codice (Java): [Seleziona]
             
String inserisci="Insert into dati (nome,data,garanzia,estensione) " + "values '"+nome+"','"+data+"','"+garanzia+"','"+modello+"');";            
try{
       database.execSQL(inserisci);
}catch(SQLiteException e){
        e.printStackTrace();
}

Ora però sto provando a scrivere il metodo per riprendere questi dati e inserili in una ListView... questa però rimane vuota :(
evidentemente sbaglio qualcosa nella definizione del metodo
Codice (Java): [Seleziona]
public void leggiTabella()
Qualcuno saprebbe dirmi come deve essere implementato questo metodo?

grazie mille per il preziosissimo aiuto!


Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al database SQLite
« Risposta #1 il: 10 Maggio 2010, 00:57:33 CEST »
0
Innanzi tutto per l'inserimento dei valori ti consiglio di utilizzare le classe ContentValues:
ContentValues | Android Developers

Il codice è pressochè questo sotto (l'ho scritto a memoria):
Codice (Java): [Seleziona]
ContentValues cv = new ContentValues();
cv.put("nome", nome);
cv.put("data", data);
cv.put("garanzia", garanzia);
cv.put("modello", modello);
database.insert("dati", "modello", cv);

Ti evita gli errori che puoi commettere andando a scriverti l'sql a manina (tra l'altro se non mi sbaglio nella tua query manca una parentesi ).

Per andare a popolare una listview con i dati provenienti dal db, un'opzione è usare la classe SimpleCursorAdapter o una custom realizzata a partire da essa. Trovi parecchi esempi con una bella googlata :)

PS: eventualmente se vuoi accertarti che i dati siano stati correttamente inseriti nel db puoi interrogarlo direttamente da shell: Android Debug Bridge | Android Developers

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Accedere al database SQLite
« Risposta #2 il: 10 Maggio 2010, 12:32:48 CEST »
0
Grazie mille Ricky per la risposta.

Allora ho fatto come suggerisci te, ho sostituito la query di inserimento con il ContentValues (anche se non ho ben capito il secondo parametro che passo a cosa serva (nel nostro caso "modello")).

Ora però non riesco a trovare una SimpleCursorAdapter ed adattarla alle mie esigenze.

La classe che avevo scritto era:
Codice (Java): [Seleziona]
     public void leggiTabella(){
         
          Cursor c = database.query("dati",null,null,null,null,null,null,null);
         
          //numero di prodotti inseriti
          int numRows = c.getCount();
         
          //mi sposto sul primo elemento
          c.moveToFirst();
         
          //aggiungo righe all'array finchè ho elementi in tabella
          for (int i = 0; i < numRows; ++i) {
                Riga r = new Riga();
                r._id = c.getLong(0);
                r.nome = c.getString(1);
                r.data = c.getString(2);
                r.garanzia = c.getString(3);
                r.estensione = c.getString(4);
               
                //creo la stringa con tutti i dati
                String rr = r.nome+" "+r.data+" "+r.garanzia+" "+r.estensione;
               
                System.out.println(rr);
               
                righe.add(rr);
               
                //passo all'elemento successivo
                c.moveToNext();
           }
     }

Ma la lista non viene visualizzata.

Ultima domanda :D ma la shell esiste anche sotto windows? Poichè non riesco a trovarla  :-[
Cosi magari riesco a capire se è un problema di inserimento non avvenuto o di visualizzazione!?!

Grazie ancora!

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al database SQLite
« Risposta #3 il: 10 Maggio 2010, 12:43:22 CEST »
0
Allora ho fatto come suggerisci te, ho sostituito la query di inserimento con il ContentValues (anche se non ho ben capito il secondo parametro che passo a cosa serva (nel nostro caso "modello")).

Se per caso il tuo ContentValues dovesse essere vuoto quello è il campo che viene forzato a NULL. Questo perchè non è permesso inserire una riga completamente vuota.

Citazione
Ora però non riesco a trovare una SimpleCursorAdapter ed adattarla alle mie esigenze.

Quali sono le tue esigenze? Fare una semplice lista nella quale ciascuna riga è composta dalla stringa che vai a formare nel metodo leggiTabella? O vuoi qualcosa dal layout un po' più articolato?

Comunque, prova a dare un occhio a questo:
List7.java | Android Developers e ai vari samples :)

Citazione
Ultima domanda :D ma la shell esiste anche sotto windows? Poichè non riesco a trovarla  :-[
Cosi magari riesco a capire se è un problema di inserimento non avvenuto o di visualizzazione!?!

Fai il classico "start"-> "esegui" -> "cmd", ti sposti nella cartella tools dell'android-sdk e da li esegui l'adb.
« Ultima modifica: 10 Maggio 2010, 12:56:50 CEST da Ricky` »

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Accedere al database SQLite
« Risposta #4 il: 10 Maggio 2010, 12:54:36 CEST »
0
Grazie ancora!

Benissimo, ho capito come funziona ContentValues.

Per il momento il mio unico intento è quello di salvare tutta la riga della tabella in una stringa e memorizzarla nella lista.
Dovrebbe essere la cosa piu faccile, ma continua a non funzionare  :-o

LISTA:
Codice (Java): [Seleziona]
private ListView lista_da_visualizzare;
ARRAY:
Codice (Java): [Seleziona]
ArrayList<String> righe = new ArrayList<String>();
INSERIMENTO ARRAY NELLA LISTA:
Codice (Java): [Seleziona]
lista_da_visualizzare.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , righe));

Ma non vengono stampati risultati e quindi volevo provare ad interrogare il DB per vedere se l'inserimento è corretto o è un problema di stampa della lista.

Adesso provo a vedere anche i samples, ma credo che siano anche troppo complessi per quello che devo fare.

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al database SQLite
« Risposta #5 il: 10 Maggio 2010, 13:04:55 CEST »
0
Fai questa semplice prova:
Codice (Java): [Seleziona]
public class List3 extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

                Listview lista = findViewById(R.id.tualist);
               
        // Get a cursor with all phones
        Cursor c = Classe.leggiTabaellaModificato();

        // Map Cursor columns to views defined in simple_list_item_2.xml
        ListAdapter adapter = new SimpleCursorAdapter(this,
                android.R.layout.simple_list_item_2, c,
                        new String[] { "nome", "modello" },
                        new int[] { android.R.id.text1, android.R.id.text2 });
        lista.setListAdapter(adapter);
    }

}

public Cursor leggiTabellaModificato(){
          return database.query("dati",null,null,null,null,null,null,null);      
}


il metodo leggiTabellaModificato() mettilo dove necessario.
Se funziona poi vediamo di affinare il layout in base alle esigenze.

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Accedere al database SQLite
« Risposta #6 il: 10 Maggio 2010, 13:21:09 CEST »
0
Ok grazie ho provato ma non funziona, questa volta crasha l'applicazione, non vorrei aver sbagliato l'inserimento, questo è il codice:
Codice (Java): [Seleziona]
package org.me.dbstudente;
import android.app.Activity;
import android.os.Bundle;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.widget.*;
import android.view.View;
import android.widget.ListView;
import android.database.Cursor;

import java.util.ArrayList;
import android.content.Intent;

public class Lista extends Activity {
     private final String DB_NAME = "bancadati.db";
     
     public static final String KEY_ROWID = "_id";
     public static final String KEY_NOME = "nome";
     public static final String KEY_DATA = "data";
     public static final String KEY_GARANZIA= "garanzia";
     public static final String KEY_ESTENSIONE = "estensione";

     private SQLiteDatabase database = null;
     
     //la lista che permette di visualizzare gli oggetti
     private ListView lista_da_visualizzare;
     
     //array di stringhe
     ArrayList<String> righe = new ArrayList<String>();

     /** Called when the activity is first created. */
   
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.lista);
         
         ListView lista = (ListView) findViewById(R.id.listav);
                 
         // Get a cursor with all phones
         Cursor c = leggiTabellaModificato();

         // Map Cursor columns to views defined in simple_list_item_2.xml
         ListAdapter adapter = new SimpleCursorAdapter(
                         this,android.R.layout.simple_list_item_2, c,
                         new String[] { "nome", "modello" },
                         new int[] { android.R.id.text1, android.R.id.text2 });
         lista.setAdapter(adapter);
     }
     
     public Cursor leggiTabellaModificato(){
         return database.query("dati",null,null,null,null,null,null,null);      
         }
 
     
    //lo creo solo se non è gia esistente
    public void creaDatabase(){
         try{          
              database=openOrCreateDatabase(DB_NAME,SQLiteDatabase.CREATE_IF_NECESSARY, null);
          } catch (SQLiteException e) {
              System.out.println("non ha creato il database");
              e.printStackTrace();
          }
     }
   
     //Premendo il pulsante inserisci ritorna all'activity di inserimento:
     private View.OnClickListener onInserisci = new View.OnClickListener(){
         public void onClick(View v) {
            Intent i = new Intent(v.getContext(), Database.class);
            startActivity(i);
         }
      };
     
     @Override
     public void onDestroy() {
          super.onDestroy();
          database.close();
     }
}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al database SQLite
« Risposta #7 il: 10 Maggio 2010, 13:25:10 CEST »
0
Devi sempre fare riferimento a ciò che dice LogCat :)
Comunque ti consiglio comunque di separare gestione di db dall'activity in se :)

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Accedere al database SQLite
« Risposta #8 il: 10 Maggio 2010, 16:26:35 CEST »
0
Devo ammettere che sono decisamente in panne :D non ci sto capendo gran che, sapresti consigliarmi una guida che spieghi come gestire delle semplici informazioni salvate in una bancadati?


Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Accedere al database SQLite
« Risposta #9 il: 20 Maggio 2010, 15:24:51 CEST »
0
Dopo un po di ricerche ho trovato una guida discreta http://www.devx.com/wireless/Article/40842/1954

Adesso il mio DB funziona benone :)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Accedere al database SQLite
« Risposta #10 il: 20 Maggio 2010, 15:52:05 CEST »
0
La butto li: ora che hai le idee perché non prepari un bel tutorial? :D
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline MMarko

  • Utente junior
  • **
  • Post: 128
  • Respect: +5
    • MarcoMatarazzi
    • Mostra profilo
    • La Rocchetta Bed And Breakfast
  • Dispositivo Android:
    HTC Legend
  • Play Store ID:
    MarcoMatarazzi
Re:Accedere al database SQLite
« Risposta #11 il: 20 Maggio 2010, 15:58:18 CEST »
0
Penso si possa fare, dammi qualche giorno per avere piu chiaro il tutto e poi ti invio un PM con un tutorial base su come usare un DB sqlite :)