简体   繁体   中英

java.lang.NullPointerException error on a query

i'm ready to develop my second app for android, and I want to use the database. But I'm blocked by an error.

This is the class:

public class MyDatabase {  

    SQLiteDatabase mDb;
    DbHelper mDbHelper;
    Context mContext;
    private static final String DB_NAME="epsoftsms";//nome del db
    private static final int DB_VERSION=1; //numero di versione del nostro db

    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
   // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento


    public void inserimentoParametri(String parametro,String valore){ //metodo per inserire i dati
            ContentValues cv=new ContentValues();
            cv.put(ParametriMetaData.PARAMETRO, parametro);
            cv.put(ParametriMetaData.VALORE, valore);
            mDb.insert(ParametriMetaData.TAB_PARAMETRI, null, cv);
    }

    public Cursor listaParametri(){ //metodo per fare la query di tutti i dati



        return mDb.query(ParametriMetaData.TAB_PARAMETRI, null,null,null,null,null,null);



    }

    static class ParametriMetaData {  // i metadati della tabella, accessibili ovunque
            static final String TAB_PARAMETRI = "parametri";
            static final String PARAMETRO = "_parametro";
            static final String VALORE = "valore";

    }

    private static final String CREA_TAB_PARAMETRI = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                    + ParametriMetaData.TAB_PARAMETRI + " ("
                    + ParametriMetaData.PARAMETRO+ " text primary key, "
                    + ParametriMetaData.VALORE + " 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);
            }

            public SQLiteDatabase getWritableDatabase() {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                    _db.execSQL(CREA_TAB_PARAMETRI);
            }

            @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

            }

    }


}

And this is part of main interested:

   final MyDatabase db=new MyDatabase(getApplicationContext());
    db.open();  //apriamo il db



    if (db.listaParametri().getCount()==0)
    {


   }

When I launch the app it return the following errors:

06-08 14:04:40.197: E/AndroidRuntime(1149): Uncaught handler: thread main exiting due to uncaught exception
06-08 14:04:40.207: E/AndroidRuntime(1149): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.axiomatic.epsoft.sms/it.axiomatic.epsoft.sms.EpsoftSMSActivity}: java.lang.NullPointerException
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.os.Looper.loop(Looper.java:123)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.ActivityThread.main(ActivityThread.java:3948)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at java.lang.reflect.Method.invokeNative(Native Method)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at java.lang.reflect.Method.invoke(Method.java:521)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at dalvik.system.NativeStart.main(Native Method)
06-08 14:04:40.207: E/AndroidRuntime(1149): Caused by: java.lang.NullPointerException
06-08 14:04:40.207: E/AndroidRuntime(1149):     at it.axiomatic.epsoft.sms.MyDatabase.listaParametri(MyDatabase.java:50)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at it.axiomatic.epsoft.sms.EpsoftSMSActivity.onCreate(EpsoftSMSActivity.java:30)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
06-08 14:04:40.207: E/AndroidRuntime(1149):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
06-08 14:04:40.207: E/AndroidRuntime(1149):     ... 11 more

What's the problem? Tnx and forgive me for some error, it's my first requesto on Stackoverflow.

This is your problem:

        public SQLiteDatabase getWritableDatabase() { 
            // TODO Auto-generated method stub 
            return null; 
        } 

You are overriding the SQLiteDatabase class getWritableDatabase method and doing nothing in it (not opening the database or anything) and returning null, so that leads to an NPE.

Delete that method and your NPE should go away.

With the code that you have shown us, the only posibility is that SQLiteDatabase mDb is null when you call listaParametri. Are you sure that you are creating the object before calling listaParametri?

// open or close database with create statement
LD_ConstantData.db=openOrCreateDatabase(LD_ConstantData.dbName,SQLiteDatabase.CREATE_IF_NECESSARY,null);
LD_ConstantData.sql = new LD_MySqlOpenHelper(LD_Multi.this, LD_ConstantData.dbName, null, 1);
String sql="CREATE TABLE if not exists "+ LD_ConstantData.Table+"("+LD_ConstantData.colId+" INTEGER PRIMARY KEY AUTOINCREMENT,"+LD_ConstantData.coluserid+" TEXT NOT NULL,"+LD_ConstantData.colFirstName+" TEXT NOT NULL,"+LD_ConstantData.colLastName+" TEXT NOT NULL);";
LD_ConstantData.sql.create_table(sql);      
LD_ConstantData.db.close();
// for insert data
    LD_ConstantData.sql =  new LD_MySqlOpenHelper(context, database_name, null, database_version);
        LD_ConstantData.db = LD_ConstantData.sql.getReadableDatabase();
LD_ConstantData.db.execSQL("INSERT INTO "+LD_ConstantData.Table +" VALUES(NULL,'"+userid+"','"+userfirstname+"','"+userlastname+"');");
        LD_ConstantData.db.close();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM