Autore Topic: Inserimento in database sqlite  (Letto 1095 volte)

Offline soeca

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7 64Bit
Inserimento in database sqlite
« il: 25 Giugno 2012, 12:45:19 CEST »
0
Ragazzi sto avendo un problema con la costruzione di un database di ricette! Di seguito vi posto le classi e il logcat perché non riesco proprio a capire per quale motivo nell'inserimento nella tabella i values sono tutti "?"...spero possiate aiutarmi perchè a breve ho un esame e mi manca solo la costruzione del database per completare l'app!Grazie a tutti!

Classe principale con un esempio di inserimento dentro il database!
Codice: [Seleziona]
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;


public class AndroidSQLiteActivity extends Activity {
    /** Called when the activity is first created. */
    TextView nome;
    TextView piatto;
    TextView cottura;
    TextView numeroP;
    TextView ingredienti;
    TextView preparazione;
    TextView ricettaDi;
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        piatto=(TextView)findViewById(R.id.tipoPiatto);
        nome=(TextView)findViewById(R.id.nome);
        cottura=(TextView)findViewById(R.id.tempoCottura);
        numeroP=(TextView)findViewById(R.id.nPersone);
        ingredienti=(TextView)findViewById(R.id.ingredienti);
        preparazione=(TextView)findViewById(R.id.preparazione);
        ricettaDi=(TextView)findViewById(R.id.ricettaDi);
       
        DatabaseHandler db = new DatabaseHandler(this);
       
        /**
         * CRUD Operations
         * */
        //ricette(String nome,String tipoPiatto,int tempoCottura,int numeroP, String ingredienti,String quantita,String preparazione,String ricettaDi,String difficolta)
        // Inserting Contacts
        Log.d("Insert: ", "Inserting ..");
       
        ricette ricetta= new ricette("A","B",10,4,"C","D","E","F","G");
       
        db.addRicetta((ricetta));


 
        // Reading all contacts
        Log.d("Reading: ", "Reading all recipes..");
        List<ricette> r = db.getAllRicette();       
       
        for (ricette cn : r) {
            String log = "Id: "+cn.getID()+" ,Name: " + cn.getNome() + " ,Fatta da: " + cn.getcreatoreRicetta();
            nome.setText(ricetta.getNome());
            piatto.setText(ricetta.getTipoPiatto());
            cottura.setText(ricetta.getCottura());
            numeroP.setText(ricetta.getnumeroP());
            ingredienti.setText(ricetta.getIngredienti());
            preparazione.setText(ricetta.getPreparazione());

         // Writing Contacts to log
        //Log.d("Name: ", log);
       
        }
    }
}

Gestore del database con creazione della tabella
Codice: [Seleziona]
import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseHandler extends SQLiteOpenHelper {

        // All Static variables
        // Database Version
        private static final int DATABASE_VERSION = 1;

        // Database Name
        private static final String DATABASE_NAME = "lap2.db";

        // Contacts table name
        private static final String TABLE_ricette = "ricette";

        // Contacts Table Columns names
        private static final String KEY_ID = "id";
        private static final String KEY_NAME = "nome";
        private static final String KEY_tipo_Piatto = "tipoPiatto";
        private static final String KEY_tempoCottura="tempoCottura";
        private static final String KEY_numeroP="numeroP";
        private static final String KEY_ingredienti="ingredienti";
        private static final String KEY_quantita="quantita";
        private static final String KEY_preparazione="preparazione";
        private static final String KEY_ricettaDi="Creatore_Ricetta";
        private static final String KEY_difficolta="difficolta";

        public DatabaseHandler(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        // Creating Tables
       
        @Override
        public void onCreate(SQLiteDatabase db) {
                String CREATE_ricette_TABLE = "CREATE TABLE " + TABLE_ricette + "("
                                + KEY_ID + " INTEGER PRIMARY KEY," + KEY_NAME + " TEXT,"
                                + KEY_tipo_Piatto + " TEXT,"+ KEY_tempoCottura+" INTEGER,"+KEY_numeroP+" INTEGER,"+
                                KEY_ingredienti+" TEXT,"+KEY_quantita+" TEXT,"+KEY_preparazione+" TEXT,"+KEY_ricettaDi+" TEXT,"+KEY_difficolta+" TEXT"+ ");";
                db.execSQL(CREATE_ricette_TABLE);
        }

        // Upgrading database
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // Drop older table if existed
                db.execSQL("DROP TABLE IF EXISTS " + TABLE_ricette);

                // Create tables again
                onCreate(db);
        }

        /**
         * All CRUD(Create, Read, Update, Delete) Operations
         */
        // Adding new ricetta
        //ricette(String nome,String tipoPiatto,int tempoCottura,int numeroP, String ingredienti,String quantita,String preparazione,String ricettaDi,String difficolta)
        void addRicetta(ricette r) {
                SQLiteDatabase db = this.getWritableDatabase();
                System.out.println("r.getNome()"+r.getNome());
                System.out.println("r.getTipoPiatto()"+r.getTipoPiatto());
                System.out.println("r.getCottura()"+r.getCottura());
                System.out.println("r.getNumeroP()"+r.getnumeroP());
                System.out.println("r.getIngredienti()"+r.getIngredienti());
                System.out.println("r.getQuantita()"+r.getQuantita());
                System.out.println("r.getPreparazione()"+r.getPreparazione());
                System.out.println("r.getCreatoreRicetta()"+r.getcreatoreRicetta());
                System.out.println("r.getDifficolta()"+r.getDifficolta());
               
               
                ContentValues values = new ContentValues();
                values.put(KEY_NAME, r.getNome());
                values.put(KEY_tipo_Piatto, r.getTipoPiatto());
                values.put(KEY_tempoCottura, r.getCottura());
                values.put(KEY_numeroP, r.getnumeroP());
                values.put(KEY_ingredienti, r.getIngredienti());
                values.put(KEY_quantita, r.getQuantita());
                values.put(KEY_preparazione, r.getPreparazione());
                values.put(KEY_ricettaDi,r.getcreatoreRicetta());
                values.put(KEY_difficolta, r.getDifficolta());
               
                // Inserting Row
                db.insert(TABLE_ricette, null, values);
                db.close(); // Closing database connection
                System.out.println("ho chiuso il collegamento con il database!");
        }

        // Getting single ricetta
        ricette getRicette(int id) {
                SQLiteDatabase db = this.getReadableDatabase();

                Cursor cursor = db.query(TABLE_ricette, new String[] { KEY_ID,
                                KEY_NAME, KEY_tipo_Piatto,KEY_tempoCottura,KEY_numeroP,
                                KEY_ingredienti,KEY_quantita,KEY_preparazione,KEY_ricettaDi,
                                KEY_difficolta }, KEY_ID + "=?",
                                new String[] { String.valueOf(id) }, null, null, null, null);
                if (cursor != null)
                        cursor.moveToFirst();
                //int _ID, String nome,String tipoPiatto,int tempoCottura,int nnumeroP, String ingredienti,String quantita,String preparazione,String ricettaDi,String difficolta
                ricette r = new ricette(Integer.parseInt(cursor.getString(0)),
                                cursor.getString(1), cursor.getString(2),Integer.parseInt(cursor.getString(3)),Integer.parseInt(cursor.getString(4)),
                                cursor.getString(5),cursor.getString(6),cursor.getString(7),cursor.getString(8),cursor.getString(9));
                // return ricette
                return r;
        }

       
        // Getting All ricette
        public List<ricette> getAllRicette() {
                List<ricette> ricetteList = new ArrayList<ricette>();
                // Select All Query
                String selectQuery = "SELECT  * FROM " + TABLE_ricette;

                SQLiteDatabase db = this.getWritableDatabase();
                Cursor cursor = db.rawQuery(selectQuery, null);

                // looping through all rows and adding to list
                if (cursor.moveToFirst()) {
                        do {
                                ricette r= new ricette();
                                r.setID(Integer.parseInt(cursor.getString(0)));
                                r.setNome(cursor.getString(1));
                                r.setTipoPiatto(cursor.getString(2));
                                r.setCottura(Integer.parseInt(cursor.getString(3)));
                                r.setnumeroP(Integer.parseInt(cursor.getString(4)));
                                r.setIngredienti(cursor.getString(5));
                                r.setQuantita(cursor.getString(6));
                                r.setPreparazione(cursor.getString(7));
                                r.setcreatoreRicetta(cursor.getString(8));
                                r.setDifficolta(cursor.getString(9));
                               
                                // Adding ricetta to list
                                ricetteList.add(r);
                        } while (cursor.moveToNext());
                }

               
                return ricetteList;
        }

        // Updating ricetta singola
        public int updateContact(ricette r) {
                SQLiteDatabase db = this.getWritableDatabase();

                ContentValues values = new ContentValues();
                values.put(KEY_NAME, r.getNome());
                values.put(KEY_tipo_Piatto, r.getTipoPiatto());
                values.put(KEY_tempoCottura, r.getCottura());
                values.put(KEY_numeroP, r.getnumeroP());
                values.put(KEY_ingredienti, r.getIngredienti());
                values.put(KEY_quantita, r.getQuantita());
                values.put(KEY_preparazione, r.getPreparazione());
                values.put(KEY_ricettaDi,r.getcreatoreRicetta());
                values.put(KEY_difficolta, r.getDifficolta());
                // updating row
                return db.update(TABLE_ricette, values, KEY_ID + " = ?",
                                new String[] { String.valueOf(r.getID()) });
        }

        // Deleting ricetta
        public void deleteRicetta(ricette r) {
                SQLiteDatabase db = this.getWritableDatabase();
                db.delete(TABLE_ricette, KEY_ID + " = ?",
                                new String[] { String.valueOf(r.getID()) });
                db.close();
        }


        // Getting ricette Count
        public int getRicetteCount() {
                String countQuery = "SELECT  * FROM " + TABLE_ricette;
                SQLiteDatabase db = this.getReadableDatabase();
                Cursor cursor = db.rawQuery(countQuery, null);
                cursor.close();

                // return count
                return cursor.getCount();
        }

}

Classe ricette con tutti i metodi get e set per le singole ricette
Codice: [Seleziona]

public class ricette {
       
        private int _ID;
        private String nome;
        private String tipoPiatto;
        private int cottura;
        private int numeroP;
        private String ingredienti;
        private String quantita;
        private String preparazione;
        private String creatoreRicetta;
        private String difficolta;
       
//Empty Constructor
        public ricette()
{
       
}
        //Constructor
        public ricette(int _ID, String nome,String tipoPiatto,int cottura,int numeroP, String ingredienti,String quantita,String preparazione,String ricettaDi,String difficolta)
        {
                this._ID=_ID;
                this.nome=nome;
                this.tipoPiatto=tipoPiatto;
                this.cottura=cottura;
                this.numeroP=numeroP;
                this.ingredienti=ingredienti;
                this.quantita=quantita;
                this.preparazione=preparazione;
                this.creatoreRicetta=creatoreRicetta;
                this.difficolta=difficolta;
        }
       
        //Other Constructor
        public ricette(String nome,String tipoPiatto,int cottura,int numeroP, String ingredienti,String quantita,String preparazione,String creatoreRicetta,String difficolta)
        {
                this.nome=nome;
                this.tipoPiatto=tipoPiatto;
                this.cottura=cottura;
                this.numeroP=numeroP;
                this.ingredienti=ingredienti;
                this.quantita=quantita;
                this.preparazione=preparazione;
                this.creatoreRicetta=creatoreRicetta;
                this.difficolta=difficolta;
        }
       
       
        public int getID()
        {
                return _ID;
        }
        public void setID(int _ID)
        {
                this._ID=_ID;
        }
       
        public int getCottura()
        {
                return cottura;
        }
       
        public void setCottura(int cottura)
        {
                this.cottura=cottura;
        }
        public int getnumeroP()
        {
                return numeroP;
        }
        public void setnumeroP(int numeroP)
        {
                this.numeroP=numeroP;
        }
       
        public String getNome()
        {
                return nome;
        }
        public void setNome(String nome)
        {
                this.nome=nome;
        }
       
        public String getTipoPiatto()
        {
                return tipoPiatto;
        }
        public void setTipoPiatto(String tipoPiatto)
        {
                this.tipoPiatto=tipoPiatto;
        }
        public String getIngredienti()
        {
                return ingredienti;
        }
        public void setIngredienti(String ingredienti)
        {
                this.ingredienti=ingredienti;
        }
       
        public String getQuantita()
        {
                return quantita;
        }
        public void setQuantita(String quantita)
        {
                this.quantita=quantita;
        }
        public String getPreparazione()
        {
                return preparazione;
        }
        public void setPreparazione(String preparazione)
        {
                this.preparazione=preparazione;
        }
        public String getcreatoreRicetta()
        {
                return creatoreRicetta;
        }
        public void setcreatoreRicetta(String creatoreRicetta)
        {
                this.creatoreRicetta=creatoreRicetta;
        }
        public String getDifficolta()
        {
                return difficolta;
        }
        public void setDifficolta(String difficolta)
        {
                this.difficolta=difficolta;
        }
}

l'XML del layout principale
Codice: [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/nome"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />
<TextView
        android:id="@+id/tipoPiatto"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />
<TextView
        android:id="@+id/tempoCottura"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />
<TextView
        android:id="@+id/nPersone"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />
<TextView
        android:id="@+id/ingredienti"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />
<TextView
        android:id="@+id/preparazione"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />

<TextView
        android:id="@+id/ricettaDi"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="" />
</LinearLayout>

Errore logcat
Codice: [Seleziona]
E/Database(15649):android.database.sqlite.SQLiteException:table ricette has no column named numeroP:, while compiling: INSERT INTO ricette(numeroP,tipoPiatto,tempoCottura,nome,preparazione,quantita,difficolta,Creatore_Ricetta) VALUES(?,?,?,?,?,?,?,?,?);

Domandona...ma perchè inserisce in modo così disordinato??Quando creo la tabella e gli passo i valori, l'ordine è sempre String nome,String tipoPiatto,int cottura,int numeroP, String ingredienti,String quantita,String preparazione,String creatoreRicetta,String difficolta dove numeroP sarebbe il numero di persone!!Grazie a tutti per l'aiuto

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Inserimento in database sqlite
« Risposta #1 il: 25 Giugno 2012, 14:01:54 CEST »
0
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline soeca

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7 64Bit
Re:Inserimento in database sqlite
« Risposta #2 il: 25 Giugno 2012, 16:47:07 CEST »
0
Grazie per il post....avevo  notato che era presente un post relativo al database ma sfortunatamente l'ho notato dopo aver creato tutte le classi quindi volevo evitare di rifare tutto nuovamente da zero e riuscire a capire dove fosse l'errore!!Anche perché se noti ho messo dei System.out in addRicette in modo da aver stampato tutti i valori che arrivano durante l'aggiunta di una nuova ricetta e ho notato che quei valori sono corretti...quindi perché l'insert fallisce restituendo tutti quei "?" ?????c'è magari qualcosa che voi notate di sbagliato in queste classi?Se c'è qualcosa che non capite del codice chiedete pure!Grazie ancora

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Inserimento in database sqlite
« Risposta #3 il: 25 Giugno 2012, 17:29:20 CEST »
0
Grazie per il post....avevo  notato che era presente un post relativo al database ma sfortunatamente l'ho notato dopo aver creato tutte le classi quindi volevo evitare di rifare tutto nuovamente da zero e riuscire a capire dove fosse l'errore!!Anche perché se noti ho messo dei System.out in addRicette in modo da aver stampato tutti i valori che arrivano durante l'aggiunta di una nuova ricetta e ho notato che quei valori sono corretti...quindi perché l'insert fallisce restituendo tutti quei "?" ?????c'è magari qualcosa che voi notate di sbagliato in queste classi?Se c'è qualcosa che non capite del codice chiedete pure!Grazie ancora
sinceramente? ci son già troppe righe in quello che hai postato per andarci dietro e hai fatto tutto un po grossolanamente, segui quel tutorial e genera codice un po più pulito, lo risolvi e sistemi il codice.
l'unica cosa che ti posso dire, è che se leggi l'errore: table ricette has no column named numeroP
è facile capire che sbagli qualcosa nella insert, quella colonna dice che non c'è nella tabella ricette.
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Inserimento in database sqlite
« Risposta #4 il: 25 Giugno 2012, 17:42:07 CEST »
0
Concordo con quanto detto da Nicola_D.

Aggiungo una prova rapida che puoi fare: usa l'adb per fare un pull del database sqlite dal device/emulatore al tuo pc, poi con un qualsiasi sqlitemanager apri il database e vedi se rispecchia quello che ti aspetti (sia struttura che contenuti), quindi prova manualmente la query di inserimento per vedere se viene correttamente eseguita. Statisticamente così risolvi l'80% degli errori.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline soeca

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7 64Bit
Re:Inserimento in database sqlite
« Risposta #5 il: 26 Giugno 2012, 16:04:23 CEST »
0
Ok grazie per il consiglio....ho cancellato tutto e ho seguito il tutorial....ora il database funziona!!Solo una curiosità volevo chiedervi: ho provato all'inizio ad inserire solo una ricetta di prova (chiamiamola A) e veniva correttamente visualizzata, successivamente nel codice ho commentato la riga di inserimento della ricetta di prova e ne ho inserita una nuova (chiamiamola B) quando ho avviato il programma nell'emulatore veniva ancora visualizzata A e non B!!Come mai???

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Inserimento in database sqlite
« Risposta #6 il: 26 Giugno 2012, 17:09:45 CEST »
0
Ok grazie per il consiglio....ho cancellato tutto e ho seguito il tutorial....ora il database funziona!!Solo una curiosità volevo chiedervi: ho provato all'inizio ad inserire solo una ricetta di prova (chiamiamola A) e veniva correttamente visualizzata, successivamente nel codice ho commentato la riga di inserimento della ricetta di prova e ne ho inserita una nuova (chiamiamola B) quando ho avviato il programma nell'emulatore veniva ancora visualizzata A e non B!!Come mai???
una volta scritta A,rimane scritta finchè non svuoti il Database (o lo cancelli).
B è stata scritta? sei sicuro?
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia