Autore Topic: Aggiungere una seconda tabella ad un database sqlite - aiuto!!!  (Letto 1222 volte)

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« il: 08 Dicembre 2012, 20:29:20 CET »
0
 Semplice ma difficile. Devo aggiungere una seconda tabella dove andrò ad inserire solamente 1 dato. Delle Stringhe. A questa tabella mi servono i metodi di delete e di query e di insert (solo 1 stringa) come nella tabella esistente. Più ci provo e più errori mi escono fuori.

Codice (Java): [Seleziona]
public class MyDatabase {  

        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="tutorialdb";//nome del db
        private static final int DB_VERSION=2; //numero di versione del nostro db
        String colums[] = {ProductsMetaData.PRODUCT_PRICE_KEY};
       
        public MyDatabase(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mDb=mDbHelper.getWritableDatabase();
               
        }
       
        public void close(){ //chiudiamo il database su cui agiamo
                mDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       
        public void insertProduct(String name,int price){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.PRODUCT_NAME_KEY, name);
                cv.put(ProductsMetaData.PRODUCT_PRICE_KEY, price);
                mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
        }

         public int deleteAll(){
                  return mDb.delete(ProductsMetaData.PRODUCTS_TABLE, null, null);
                 }

         public void update(String name, int price){
                  ContentValues values = new ContentValues();
                  values.put(ProductsMetaData.PRODUCT_NAME_KEY, name);
                  values.put(ProductsMetaData.PRODUCT_PRICE_KEY, price);
                  mDb.delete(ProductsMetaData.PRODUCTS_TABLE, null, null);
                        mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, values);

                 }
        public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati
                return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,null,null,null,null,null);              
        }

        static class ProductsMetaData {  // i metadati della tabella, accessibili ovunque
                static final String PRODUCTS_TABLE = "products";
                static final String ID = "_id";
                static final String PRODUCT_NAME_KEY = "name";
                static final String PRODUCT_PRICE_KEY = "price";
                static final String PRODUCT_NUMERO_KEY = "numero";
        }

        private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID+ " integer primary key autoincrement, "
                        + ProductsMetaData.PRODUCT_NAME_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_PRICE_KEY + " integer not null"
                        + ProductsMetaData.PRODUCT_PRICE_KEY + " integer not null);";
       

        private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

                public DbHelper(Context context, String name, CursorFactory factory,int version) {
                        super(context, name, factory, version);
                }
                @Override
                public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                        _db.execSQL(PRODUCTS_TABLE_CREATE);
                }
                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

                }
        }
}
« Ultima modifica: 09 Dicembre 2012, 15:45:13 CET da Ray13 »

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:Aggiungere una seconda tabella al database SQLITE
« Risposta #1 il: 09 Dicembre 2012, 09:07:06 CET »
0
Potresti per cortesia editare il titolo del post per evitare di usare tutte lettere maiuscole?

Quanto agli errori, postali pure, così vediamo di darti una mano.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« Risposta #2 il: 09 Dicembre 2012, 16:00:37 CET »
0
Allora modificato titolo. Ho modificato il database funzionante aggiungendo la tabella CONTA_TABLE che contiene solo 1 id autoincrementale e 1 stringa. Quando eseguo un metodo stupido crasha dicendo che quando prova a fare la query non trova la tabella. Riporto il nuovo database:

Codice (Java): [Seleziona]
package ray13.tryquiz;

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

public class MyDatabase {  

        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="tutorialdb";//nome del db
        private static final int DB_VERSION=2; //numero di versione del nostro db
        String colums[] = {ProductsMetaData.PRODUCT_PRICE_KEY};
        public MyDatabase(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mDb=mDbHelper.getWritableDatabase();
               
        }
       
        public void close(){ //chiudiamo il database su cui agiamo
                mDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       
        public void insertProduct(String name,int price){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.PRODUCT_NAME_KEY, name);
                cv.put(ProductsMetaData.PRODUCT_PRICE_KEY, price);
                mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
        }
       
        public void insertConta(String conta){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.CONTA_KEY, conta);
                mDb.insert(ProductsMetaData.CONTA_TABLE, null, cv);
        }

         public int deleteAll(){
                  return mDb.delete(ProductsMetaData.PRODUCTS_TABLE, null, null);
                 }

         public void update(String name, int price){
                  ContentValues values = new ContentValues();
                  values.put(ProductsMetaData.PRODUCT_NAME_KEY, name);
                  values.put(ProductsMetaData.PRODUCT_PRICE_KEY, price);
                  mDb.delete(ProductsMetaData.PRODUCTS_TABLE, null, null);
                        mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, values);

                 }
        public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati
                return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,null,null,null,null,null);              
        }
        public Cursor fetchProductsConta(){ //metodo per fare la query di tutti i dati
                return mDb.query(ProductsMetaData.CONTA_TABLE, null,null,null,null,null,null);         
        }

        static class ProductsMetaData {  // i metadati della tabella, accessibili ovunque
                static final String PRODUCTS_TABLE = "products";
                static final String CONTA_TABLE = "tabellaconta";
                static final String ID = "_id";
                static final String ID2 = "_id";
                static final String PRODUCT_NAME_KEY = "name";
                static final String CONTA_KEY = "conta";
                static final String PRODUCT_PRICE_KEY = "price";
                static final String PRODUCT_NUMERO_KEY = "numero";
        }

        private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID+ " integer primary key autoincrement, "
                        + ProductsMetaData.PRODUCT_NAME_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_PRICE_KEY + " integer not null"
                        + ProductsMetaData.PRODUCT_PRICE_KEY + " integer not null);";
       
        private static final String CONTA_TABLE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID2+ " integer primary key autoincrement "
                        + ProductsMetaData.CONTA_KEY + " text not null);";
       

        private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

                public DbHelper(Context context, String name, CursorFactory factory,int version) {
                        super(context, name, factory, version);
                }
                @Override
                public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                        _db.execSQL(PRODUCTS_TABLE_CREATE);
                        _db.execSQL(CONTA_TABLE);
                }
                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

                }
        }
}

Ed il log di errore:

Codice (Java): [Seleziona]
12-09 14:56:39.625: E/AndroidRuntime(803): java.lang.RuntimeException: Unable to start activity ComponentInfo{ray13.tryquiz/ray13.tryquiz.ImageTextListBaseAdapterActivity}: android.database.sqlite.SQLiteException: no such table: tabellaconta (code 1): , while compiling: SELECT * FROM tabellaconta
Posto anche la parte di codice che tenta di chiamare la seconda tabella. Fa parte dell'OnCreate dell'activity ImageTextListBaseAdapterActivity

Codice (Java): [Seleziona]
                        MyDatabase db=new MyDatabase(getApplicationContext());
                        db.open();  //apriamo il db
                          if(db.fetchProductsConta().getCount()==0){//inserimento dati, solo se il db è vuoto

                              db.insertConta("Ciao");
                          }
                          Cursor c2=db.fetchProductsConta();
                          int contaCol=c2.getColumnIndex(MyDatabase.ProductsMetaData.CONTA_KEY);
                            if(c2.moveToFirst()){  //se va alla prima entry, il cursore non è vuoto
                                do {

                                    System.out.println(c2.getString(contaCol));  
             
                                        } while (c2.moveToNext());//iteriamo al prossimo elemento
                        }

Se potete aiutatemi, sono 3 giorni che sono su questo problema e creata la seconda tabella funzionante l'app è finita eheh

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« Risposta #3 il: 09 Dicembre 2012, 18:48:11 CET »
0
L'errore è chiaro manca la tabella:

Citazione
android.database.sqlite.SQLiteException: no such table: tabellaconta

Basta vedere il codice di inizializzazione, la seconda tabella non viene creata, ha lo stesso nome della prima:

Codice (Java): [Seleziona]
static final String PRODUCTS_TABLE = "products";
static final String CONTA_TABLE = "tabellaconta";

...

private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("

...

private static final String CONTA_TABLE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("

Usi "PRODUCTS_TABLE" al posto di "CONTA_TABLE".

adb logcat | tee /tmp/logcat | grep TAG

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« Risposta #4 il: 09 Dicembre 2012, 19:25:34 CET »
0
Hai ragione. Sono uno stupido. Ho cambiato quel pezzo ma continua a darmi

Codice (Java): [Seleziona]
12-09 18:22:44.673: E/SQLiteLog(667): (1) no such table: tabellaconta
12-09 18:22:44.723: E/AndroidRuntime(667): java.lang.RuntimeException: Unable to start activity ComponentInfo{ray13.tryquiz/ray13.tryquiz.ImageTextListBaseAdapterActivity}: android.database.sqlite.SQLiteException: no such table: tabellaconta (code 1): , while compiling: SELECT * FROM tabellaconta

Ho pensato che forse è la copia sqlite già creata che non accetta l'inserimento di una nuova tabella e, per cancellare tutto il db precedente, ho provato a chiudere eclipse e emulatore, chiudere il progetto, riaprirlo e fare un clean del progetto. Ma ancora mi dice che non trova la tabella... Idee?

Ripropongo il codice del database aggiornato:

Codice (Java): [Seleziona]
package ray13.tryquiz;

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

public class MyDatabase {  

        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="tutorialdb";//nome del db
        private static final int DB_VERSION=2; //numero di versione del nostro db
        String colums[] = {ProductsMetaData.PRODUCT_PRICE_KEY};
        public MyDatabase(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mDb=mDbHelper.getWritableDatabase();
               
        }
       
        public void close(){ //chiudiamo il database su cui agiamo
                mDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       
        public void insertProduct(String name,int price){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.PRODUCT_NAME_KEY, name);
                cv.put(ProductsMetaData.PRODUCT_PRICE_KEY, price);
                mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
        }
       
        public void insertConta(String conta){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.CONTA_KEY, conta);
                mDb.insert(ProductsMetaData.CONTA_TABLE, null, cv);
        }

         public int deleteAll(){
                  return mDb.delete(ProductsMetaData.PRODUCTS_TABLE, null, null);
                 }

         public void update(String name, int price){
                  ContentValues values = new ContentValues();
                  values.put(ProductsMetaData.PRODUCT_NAME_KEY, name);
                  values.put(ProductsMetaData.PRODUCT_PRICE_KEY, price);
                  mDb.delete(ProductsMetaData.PRODUCTS_TABLE, null, null);
                        mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, values);

                 }
        public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati
                return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,null,null,null,null,null);              
        }
        public Cursor fetchProductsConta(){ //metodo per fare la query di tutti i dati
                return mDb.query(ProductsMetaData.CONTA_TABLE, null,null,null,null,null,null);         
        }

        static class ProductsMetaData {  // i metadati della tabella, accessibili ovunque
                static final String PRODUCTS_TABLE = "products";
                static final String CONTA_TABLE = "tabellaconta";
                static final String ID = "_id";
                static final String ID2 = "_id";
                static final String PRODUCT_NAME_KEY = "name";
                static final String CONTA_KEY = "conta";
                static final String PRODUCT_PRICE_KEY = "price";
                static final String PRODUCT_NUMERO_KEY = "numero";
        }

        private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID+ " integer primary key autoincrement, "
                        + ProductsMetaData.PRODUCT_NAME_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_PRICE_KEY + " integer not null"
                        + ProductsMetaData.PRODUCT_PRICE_KEY + " integer not null);";
       
        private static final String CONTA_TABLE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                        + ProductsMetaData.CONTA_TABLE + " ("
                        + ProductsMetaData.ID2+ " integer primary key autoincrement "
                        + ProductsMetaData.CONTA_KEY + " text not null);";
       

        private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

                public DbHelper(Context context, String name, CursorFactory factory,int version) {
                        super(context, name, factory, version);
                }
                @Override
                public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                        _db.execSQL(PRODUCTS_TABLE_CREATE);
                        _db.execSQL(CONTA_TABLE);
                }
                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

                }
        }
}

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« Risposta #5 il: 09 Dicembre 2012, 23:21:41 CET »
0
Il procedimento che hai descritto non ha senso visto che il DB in questione risiede nell'emulatore o nel dispositivo.

L'emulatore ha root abilitato quindi puoi cancellare direttamente il DB se sai dove è posizionato. In un dispositivo senza root devi andare nelle impostazioni del pacchetto e cancellare tutti i dati. Nel caso più estremo puoi rimuovere il pacchetto.

Con un codice completo basta incrementare la versione del DB per aggiornare o correggere il DB, ma tu non hai implementato questa parte.

adb logcat | tee /tmp/logcat | grep TAG

Offline Ray13

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« Risposta #6 il: 10 Dicembre 2012, 00:18:17 CET »
0
Si, ogni tanto dico cose senza senso che è neanche 1 mese che programmo in android XD

Comunque ho risolto!
Il problema infatti era proprio quello. Non sono riuscito a cancellare il db dell'emulatore ma ho fatto partire un nuovo emulatore e funziona tutto correttamente.

Offline xixietto

Re:Aggiungere una seconda tabella ad un database sqlite - aiuto!!!
« Risposta #7 il: 17 Settembre 2014, 15:51:07 CEST »
0
creando questo tipo di db.. come si fanno le query??
ad esempio voglio far laquery(prendimi alcuni valori x di della tabella y )
e per inserire una listview che stampi i valori del database??