Autore Topic: Problema creazione tabella database SQLite  (Letto 1792 volte)

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Problema creazione tabella database SQLite
« il: 24 Ottobre 2011, 18:53:51 CEST »
0
Salve a tutti.
Sto creando un'applicazione android che utilizza un database SQLite.
Per creare il database, dopo  aver consultato diverse guide, mi sono servito di una classe DatabaseHelper.
Poi gestisco il database da un'altra classe, ma ciò non rappresenta il problema visto che il database non viene mai creato.
Posto il codice dell'helper di seguito.

Codice (Java): [Seleziona]
package it.silence.please;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper  {

        // Stringhe elementi della tabella
        public static final String KEY_ROWID = "_id";
        public static final String LAT = "latitudine";
        public static final String LON = "longitudine";
        public static final String PRO = "profilo";
        public static final String LUO = "luogo";

       
        private static final String DATABASE_NAME = "location_database";       
        private static final String DATABASE_TABLE = "location";
        private static final int DATABASE_VERSION = 1;
       
        private static final String TAG = "LocationTable";
       
        // Stringa per la creazione del database
        private static final String DATABASE_CREATE =
                "create table " + DATABASE_TABLE + " ("
                + KEY_ROWID + " integer primary key autoincrement, "
            + LUO + " String, "
            + LAT + " integer, "
            + LON + " integer, "
            + PRO + " integer);";
       
        DatabaseHelper(Context context) {
              super(context, DATABASE_NAME, null, DATABASE_VERSION);
              Log.i(TAG, "Costruttore DBhelper");
        }
       
        @Override
    public void onCreate(SQLiteDatabase db) {
                Log.i(TAG, "Creo il DataBase: " + DATABASE_CREATE);
                db.execSQL(DATABASE_CREATE);
    }
       
        @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.w(TAG, "Aggiorno il Database dalla versione " + oldVersion + " alla "
          + newVersion + ", verranno distrutti tutti i vecchi dati");
                db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
                onCreate(db);
    }
}

Fatto sta che istanziando un oggetto di tipo DatabaseHelper (come ho fatto), l'applicazione dovrebbe creare una tabella del database eseguendo il codice situato all'interno del metodo onCreate, ma CIÒ NON AVVIENE!
In pratica guardando i log mi sono accorto che il programma arriva nel costruttore DatabaseHelper, ma non arriva mai nel metodo onCreate.
Per essere ancora più esplicito non leggo mai il log.
Codice (Java): [Seleziona]
Log.i(TAG, "Creo il DataBase: " + DATABASE_CREATE);Non ho la minima idea di perchè ciò avvenga, quindi chiendo cortesemente il vostro aiuto.
Grazie  :-P
« Ultima modifica: 24 Ottobre 2011, 18:57:55 CEST da neoben »

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema creazione tabella database SQLite
« Risposta #1 il: 24 Ottobre 2011, 18:59:57 CEST »
0
Prova a cambiare, nella stringa di creazione della tabella, la parte "String" con "text", e prima di farla partire, vai nel menù "applicazioni" di Android e cancella i dati dell'applicazione, così parti "pulito".  ;-)
« Ultima modifica: 24 Ottobre 2011, 19:02:38 CEST da Verandi »

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #2 il: 24 Ottobre 2011, 19:05:23 CEST »
0
Prova a cambiare, nella stringa di creazione della tabella, la parte "String" con "text", e prima di farla partire, vai nel menù "applicazioni" di Android e cancella i dati dell'applicazione, così parti "pulito".  ;-)

Fatto, ma non cambia nulla.  :-(
Il problema è che il messaggio di log è inserito prima della query, quindi suppongo che il problema non sia nella esecuzione della query, ma nel fatto che l'applicazione non entra affatto nel metodo onCreate.
In ogni caso grazie per l'interessamento.
Spero di riuscite a trovare consigli utili.

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema creazione tabella database SQLite
« Risposta #3 il: 24 Ottobre 2011, 19:10:16 CEST »
0
Se usi la classica classe DbHelper dell tutorial sul sito di Android, quando istanzi e basta la classe, cambi solo il valore della variabile context. Perché la tabella venga creata dovresti fare dbhelper.open() dopo averla istanziata.  ;-)

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #4 il: 24 Ottobre 2011, 19:20:29 CEST »
0
Richiamo il metodo open da un'altra classe che a sua volta richiama l'helper.
Posto il codice dell'helper (nuovamente)  e  della classe che uso per gestire il database.
Codice (Java): [Seleziona]
package it.silence.please;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper  {

        // Stringhe elementi della tabella
        public static final String KEY_ROWID = "_id";
        public static final String LAT = "latitudine";
        public static final String LON = "longitudine";
        public static final String PRO = "profilo";
        public static final String LUO = "luogo";

       
        private static final String DATABASE_NAME = "location_database";       
        private static final String DATABASE_TABLE = "location";
        private static final int DATABASE_VERSION = 1;
       
        private static final String TAG = "LocationTable";
       
        // Stringa per la creazione del database
        private static final String DATABASE_CREATE =
                "create table " + DATABASE_TABLE + " ("
                + KEY_ROWID + " integer primary key autoincrement, "
            + LUO + " text, "
            + LAT + " integer, "
            + LON + " integer, "
            + PRO + " integer);";
       
        DatabaseHelper(Context context) {
              super(context, DATABASE_NAME, null, DATABASE_VERSION);
              Log.i(TAG, "Costruttore DBhelper");
        }
       
        @Override
    public void onCreate(SQLiteDatabase db) {
                Log.i(TAG, "Creo il DataBase: " + DATABASE_CREATE);
                db.execSQL(DATABASE_CREATE);
    }
       
        @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.w(TAG, "Aggiorno il Database dalla versione " + oldVersion + " alla "
          + newVersion + ", verranno distrutti tutti i vecchi dati");
                db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
                onCreate(db);
    }
}

Codice (Java): [Seleziona]
package it.silence.please;

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

public class SilenceDatabase {
       
        // Stringhe elementi della tabella
        public static final String KEY_ROWID = "_id";
        public static final String LAT = "latitudine";
        public static final String LON = "longitudine";
        public static final String PRO = "profilo";
        public static final String LUO = "luogo";

        // Stringhe nomi del database
        private static final String DATABASE_NAME = "location_database";       
        private static final String DATABASE_TABLE = "location";
        private static final int DATABASE_VERSION = 1;
       
        // Oggetti per la gestione del database
        private static final String TAG = "LocationTable";
        private DatabaseHelper mDbHelper;
        private SQLiteDatabase mDb;
        private final Context mCtx;
       
        public SilenceDatabase (Context ctx) {
            this.mCtx = ctx;
          }
       
        // Apre la connessione al mDbHelper = new DatabaseHelper(mCtx); Database
        public SilenceDatabase open() throws SQLException {
            Log.i(TAG, "Apro la connessione al Database....");
            mDbHelper = new DatabaseHelper(mCtx);
            mDb = mDbHelper.getWritableDatabase();
            return this;
          }
       
        // Chiude la connessione al database
        public void close() {
            mDbHelper.close();
          }
       
        // Crea una tabella del database
        public long createLocation(String luog, int lati, int longi, int prof) {
            Log.i(TAG, "Inserting record...");
            ContentValues initialValues = new ContentValues();
            initialValues.put(LUO, luog);
            initialValues.put(LAT, lati);
            initialValues.put(LON, longi);
            initialValues.put(PRO, prof);

            return mDb.insert(DATABASE_TABLE, null, initialValues);
          }
       
        // Cancella una tabella del database
        public boolean deleteLocations(long rowId) {
                 
            return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
          }
       
        // Trova tutte le tabelle del database
        public Cursor fetchAllLocation() {
                 
            return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, LUO, LAT, LON, PRO},null, null, null, null, null);
          }
       
        // Trova una particolare tabella del databse
        public Cursor fetchLocation(long locId) throws SQLException {
                 
            Cursor mCursor =
         
              mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, LUO, LAT, LON, PRO}, KEY_ROWID + "=" + locId, null,
                  null, null, null, null);
            if (mCursor != null) {
              mCursor.moveToFirst();
            }
            return mCursor;
        }
       
        // Aggiorna una particolare tabella del database
        public boolean updateLocation(int locId, String luog, int lati, int longi, int prof) {
            ContentValues args = new ContentValues();
            args.put(LUO, luog);
            args.put(LAT, lati);
            args.put(LON, longi);
            args.put(PRO, prof);
         
            return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + locId, null) > 0;
          }
}

Poi nella mia attività creo un oggetto di tipo SilenceDatabase
Codice (Java): [Seleziona]
SilenceDatabase db;e richiamo la funzione open
Codice (Java): [Seleziona]
db.open()
Purtroppo non funziona.

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema creazione tabella database SQLite
« Risposta #5 il: 24 Ottobre 2011, 19:28:57 CEST »
0
Prima dell'open, però, devi anche creare l'oggetto:
Codice (Java): [Seleziona]
db = new SilenceDatabase(context)
« Ultima modifica: 24 Ottobre 2011, 19:31:58 CEST da Verandi »

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #6 il: 24 Ottobre 2011, 19:31:08 CEST »
0
Prima dell'open, però, devi anche creare l'oggetto:
Codice (Java): [Seleziona]
db = new SilenceDatabase(context)
Però mi sfugge perché tu abbia due classi. Te ne basta una, no?

Si, istanzio l'oggetto creato come da te indicato.
Uso due classi perchè in una creo il database e nell'altra ci ho messo le funzioni apposite per l'inserimento di elementi all'interno delle tabelle ecc....

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema creazione tabella database SQLite
« Risposta #7 il: 24 Ottobre 2011, 19:37:09 CEST »
0
Tutto il codice che hai postato mi sembra corretto. Il log fino a dove arriva? Perché è davvero strano che magari ti visualizzi il messaggio di apertura del database ma non quello dell'onCreate subito dopo.

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #8 il: 24 Ottobre 2011, 19:39:43 CEST »
0
È esattamente quello che succede.
Visualizzo il log del costrutture dell'helper, quello di apertura del database, ma non quello all'interno dell' onCreate dell'helper.
Mi sembra molto strano anche a me....ecco perchè non so dove andare a parare.

Oltre ad altri consigli, mi passereste anche il link con l'esempio del DatabaseHelper dal sito delle referenze ufficiali android ?
Non riesco più a rintracciarlo.
Grazie!

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema creazione tabella database SQLite
« Risposta #9 il: 24 Ottobre 2011, 19:48:02 CEST »
+1
L'ultimo tentativo che ti direi di fare è inserire il
Codice (Java): [Seleziona]
 Log.i(TAG, "Apro la connessione al Database...."); dopo
Codice (Java): [Seleziona]
            mDb = mDbHelper.getWritableDatabase();, in modo da vedere se quest'ultimo metodo fallisce. Se riesci a visualizzare ancora "apro la connessione al database", e l'applicazione non dà errori, al 90% la tabella è già stata creata e devi cancellare i dati dell'applicazione.

L'esempio del database helper è nel notepad tutorial.  ;-)

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #10 il: 24 Ottobre 2011, 20:01:01 CEST »
0
Riesco a visualizzare il log, quindi la tabella potrebbe esser stata creata.
A questo punto un'altra domanda: come cancello i dati dell'applicazione? (Utilizzo eclipse con emulatore dispositivo android)

Offline Verandi

  • Utente normale
  • ***
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema creazione tabella database SQLite
« Risposta #11 il: 24 Ottobre 2011, 20:04:06 CEST »
0
Devi andare in menù/impostazioni/applicazioni/gestisci applicazioni/ trovi la tua applicazione e premi su cancella dati.

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #12 il: 24 Ottobre 2011, 20:40:46 CEST »
0
Devi andare in menù/impostazioni/applicazioni/gestisci applicazioni/ trovi la tua applicazione e premi su cancella dati.

Grazie.
Proverò ancora e vi metterò al corrente.

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #13 il: 25 Ottobre 2011, 11:00:15 CEST »
0
Ho provato a disinstallare l'applicazione e a reinstallarla da capo.
Non mi appare ancora il messaggio di log, ma non viene riscontrato (sempre nel log file) nessun errore legato al database.
Probabilmente il problema risiedeva proprio nei dati memorizzati dall'applicazione.
Farò altre prove per vedere se il database risulta funzionante.

Ringrazio molto Verandi per l'attenzione ed i consigli!
« Ultima modifica: 25 Ottobre 2011, 11:04:11 CEST da neoben »

Offline neoben

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: 0
    • carminebenedetto
    • neoben86
    • Mostra profilo
    • Neoben Web
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Ubuntu 12.04
Re:Problema creazione tabella database SQLite
« Risposta #14 il: 26 Ottobre 2011, 10:21:24 CEST »
0
Dopo varie prove confermo che cancellando i dati dell'applicazione ho risolto il problema.
Il log relativo alla creazione del database non viene mai visualizzato, ma il database viene creato ugualmente in maniera corretta.
Grazie ancora per i consigli.