Autore Topic: NullPointer Exception su inserimento dati in db  (Letto 287 volte)

Offline Bito92

  • Utente junior
  • **
  • Post: 51
  • Respect: +7
    • Mostra profilo
NullPointer Exception su inserimento dati in db
« il: 05 Dicembre 2011, 10:40:42 CET »
0
Vi spiego brevemente il problema, sto costrunedo un' applicazione che al primo accesso chiede la configurazione di essa stessa, ovvero se ho la tabella del db vuota devo inserire dei dati per far si che si configuri.

Il problema e che quando vado a cliccare sul pulstante configura, dovrei andare ad inserire/aggiornare i dati che gli passo dentro alla tabella, ma va in errore. ho cercato di risolvere l'errore, ma con scarsi risultati. riuscireste a darmi una mano?
ve ne sarei infinitamente grato  :-)
vi allego il codice e il logcat.

classe con le funzioni relative al db:
Codice (Java): [Seleziona]
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class sevenDb extends SQLiteOpenHelper{
       
        private SQLiteDatabase db;
       
        /* Nome del DB da cui recuperare le informazioni  */
        private static final String DB_NAME = "Prova.db";
       
        /*
         * Livello DB, se aumentato alla chiamata di questa classe verrà
         * chiamato l'upgrade in caso di aggiornamento
         */

        private static final int SCHEMA_VERSION = 1;
       
        /* Formattazione tabella Parametri*/
        class Params{
                static final String tab = "Params";
                static final String ind = "Indice";
                static final String val = "Valore";
        }

        /* Costruttore, chiamo il costruttore padre passandogli il contesto */
        public sevenDb(Context context)
        {
                super(context, DB_NAME, null, SCHEMA_VERSION);
        }

        /*
         * Funzione Astratta che si occupa di creare il DB se non è presente
         * Al momento della creazione del DB creo la tabella dei parametri
         */

        @Override
        public void onCreate(SQLiteDatabase db) {
                /*
                 * Eseguo la query dentro try/catch e stampo su logcat il messaggio di
                 * corretta creazione in caso positivo
                 * errata creazione in caso negativo
                 */

                try{
                        /*
                         * Creo la stringa che mi permette di effettuare la query sul DB
                         * e creare la tabella dei parametri
                         * */

                        final String createTable = "CREATE TABLE IF NOT EXISTS " + Params.tab + " (" + Params.ind + " text primary key not null, " + Params.val + " text not null);";
                       
                        db.execSQL(createTable);
                        System.out.println("Tabella creata correttamente/esiste gia");
                        /*
                         * Spazio dedicato alla valorizzazione della tabella Params
                         */

                       
                }
                catch(SQLiteException e){
                        System.out.println("creazione tabella non avvenuta correttamente: " + e.getMessage());
                }
               
        }
       
        /* Funzione Astratta che si occupa di AGGIORNARE il DB se non è presente */
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // TODO Auto-generated method stub
        }
       
        /* Funzione che effettua la lettura di una tabella */
        public Cursor selectTable(String table, String[] columns, String selection, String[] selectArg,
                                                                String groupBy, String having, String orderBy, String limit) {
                return (getReadableDatabase().query(table, columns ,selection , selectArg, groupBy, having, orderBy, limit));
        }
       
        /* Funzione che effettua l'inserimento/aggiornamento di dati nella tabella */
        public boolean insertTable(String table, ContentValues values, String whereClause){
       
                String nullColumnHack = Params.ind;
               
                if (db.insert(table, nullColumnHack, values) == 0) {
                        System.out.println(table+","+nullColumnHack+","+values);
                        if (db.update(table, values, whereClause, null) > 0) {
                                /* E' stato aggiornato correttamente */
                                System.out.println("Aggiornamento avvenuto");
                                return true;
                        }
                } else {
                        /* E' stato inserito correttamente */
                        System.out.println("Inserimento avvenuto");
                        return true;
                }
               
                return false;
        }
       
        /* Funzione che elimina i dati presenti in una tabella */
        public int deleteTable(String table, String whereClause, String[] whereArgs){
                return db.delete(table, whereClause, whereArgs);
        }
       
        /* Funzione che passando un indice recupera il parametro dalla tabella */
        public String getParams(String index) {
                /* Effettuo query sull'indice della tabella Params */
                Cursor c = selectTable(Params.tab, new String[] { Params.val },  Params.ind + " = '" + index + "'", null, null, null, null, null);
               
                if (c.getCount() > 0) {
                        /* Se sono stati recuperati dei valori allora li recupero */
                        c.moveToFirst();               
                        return c.getString(0);
                } else {
                        /* se non c'è nulla ritorno null */
                        return null;
                }
        }
       
        /* Funzione che passando un indice ed il suo valore aggiorna la tabella */
        public boolean updateParams(String index, String value) {
                ContentValues cv = new ContentValues();
                String where ="where " + Params.ind +" = "+index;
                cv.put(Params.val, value);
                return insertTable(Params.tab, cv, where);
        }
       
        /* Funzione che passando un indice lo elimina dalla tabella dei parametri */
        public boolean  deleteParams(String index) {
                return deleteTable(Params.tab, Params.ind + " = '" + index + "'", null) > 0;
        }
       
}

classe dove inserisco i dati e ho il pulsante configura:

Codice (Java): [Seleziona]
import com.seven.fmk.sevenDb;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class Configurazione extends Activity{
        Context context = this;
        SQLiteDatabase db;
        sevenDb sdb;
        private static final String DB_NAME = "Prova.db";
        @Override
        public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                setContentView(R.layout.config);
                final EditText codFisc = (EditText)findViewById(R.id.user);
                final EditText targa = (EditText)findViewById(R.id.password);
                sdb = new sevenDb(getBaseContext());
        db = openOrCreateDatabase(DB_NAME, SQLiteDatabase.CREATE_IF_NECESSARY, null);
                Button conferma = (Button)findViewById(R.id.conferma);
                conferma.setOnClickListener(new View.OnClickListener() {
                       
                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub
                                String us= codFisc.getText().toString();
                                String pass= targa.getText().toString();
                                if ((us.equals("")||pass.equals(""))){
                                        new AlertDialog.Builder(context)
                                        .setTitle("Attenzione")
                                        .setMessage("Completa configurazione")
                                        .setPositiveButton("OK",new DialogInterface.OnClickListener() {
                                               
                                                @Override
                                                public void onClick(DialogInterface dialog, int which) {
                                                        // TODO Auto-generated method stub
                                                       
                                                }
                                        }).show();
                                }else{
                                        System.out.println(us + " " + pass);
                                        sdb.updateParams(us, pass);
                                        finish();
                                }
                        }
                       
                        });    
                };
       
        /* Gestisto il tasto back del telefono da codice in modo
         * da inserire i dati in maniera corretta e consentire l'utilizzo ai
         * soli utenti che effettuano la corretta configurazione */

        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event)  {
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
                if (sdb.getParams("Indice")== null || sdb.getParams("Valore") == null){
                                new AlertDialog.Builder(this)
                                .setTitle("ATTENZIONE")
                                .setMessage("Non hai effettuato correttamente la configurazione")
                                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                       
                                        @Override
                                        public void onClick(DialogInterface dialog, int which) {
                                                // TODO Auto-generated method stub
                                               
                                        }
                                }).show();
                        }
                return true;
            }

            return super.onKeyDown(keyCode, event);
        }
       
}

e questo e il logcat:

12-05 10:21:56.846: E/AndroidRuntime(622): Uncaught handler: thread main exiting due to uncaught exception
12-05 10:21:56.855: E/AndroidRuntime(622): java.lang.NullPointerException
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.seven.fmk.sevenDb.insertTable(sevenDb.java:84)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.seven.fmk.sevenDb.updateParams(sevenDb.java:129)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.seven.app.Configurazione$1.onClick(Configurazione.java:52)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.View.performClick(View.java:2364)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.View.onKeyUp(View.java:3985)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.widget.TextView.onKeyUp(TextView.java:4433)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.KeyEvent.dispatch(KeyEvent.java:1061)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.View.dispatchKeyEvent(View.java:3683)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:748)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1655)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1102)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.app.Activity.dispatchKeyEvent(Activity.java:2038)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1631)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2368)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2338)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1641)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.os.Looper.loop(Looper.java:123)
12-05 10:21:56.855: E/AndroidRuntime(622):    at android.app.ActivityThread.main(ActivityThread.java:4363)
12-05 10:21:56.855: E/AndroidRuntime(622):    at java.lang.reflect.Method.invokeNative(Native Method)
12-05 10:21:56.855: E/AndroidRuntime(622):    at java.lang.reflect.Method.invoke(Method.java:521)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
12-05 10:21:56.855: E/AndroidRuntime(622):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
12-05 10:21:56.855: E/AndroidRuntime(622):    at dalvik.system.NativeStart.main(Native Method)


praticamente l'app si blocca quando arrivo qui: if (db.insert(table, nullColumnHack, values) == 0) {

Vi ringrazio in anticipo  ;-)

Offline cioppy

  • Nuovo arrivato
  • *
  • Post: 35
  • Respect: +3
    • giancarlo985
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Play Store ID:
    Team Android
  • Sistema operativo:
    Linux Mint 12 - 64bit
Re:NullPointer Exception su inserimento dati in db
« Risposta #1 il: 06 Dicembre 2011, 12:07:10 CET »
0
Ciao.
Penso che il problema sia proprio in : 
Codice (Java): [Seleziona]
if (db.insert(table, nullColumnHack, values) == 0) il metodo insert restituisce un long, ma non puoi controllare in questo modo se il db è vuoto o meno.

Potresti fare una query, e controllare che un determinato campo di una colonna è vuoto o meno !!!!