Question

I have a exception thrown when I call the method getWritableDatabase. Reading some similar problems I think is about a problem with the context but I don´t know why.

Here is the LOGCAT:

07-22 09:33:57.534: E/AndroidRuntime(406): FATAL EXCEPTION: main
07-22 09:33:57.534: E/AndroidRuntime(406): java.lang.NullPointerException
07-22 09:33:57.534: E/AndroidRuntime(406):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
07-22 09:33:57.534: E/AndroidRuntime(406):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.example.login.DBEntrenamiento.addEntrenamiento(DBEntrenamiento.java:26)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.example.login.Entrenamiento.saveEntrenamiento(Entrenamiento.java:136)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.example.login.Entrenamiento.access$2(Entrenamiento.java:127)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.example.login.Entrenamiento$2.onExecuteHttpPostAsyncListener(Entrenamiento.java:106)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.example.login.HttpClientManager$1.run(HttpClientManager.java:129)
07-22 09:33:57.534: E/AndroidRuntime(406):  at android.os.Handler.handleCallback(Handler.java:587)
07-22 09:33:57.534: E/AndroidRuntime(406):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-22 09:33:57.534: E/AndroidRuntime(406):  at android.os.Looper.loop(Looper.java:123)
07-22 09:33:57.534: E/AndroidRuntime(406):  at android.app.ActivityThread.main(ActivityThread.java:4627)
07-22 09:33:57.534: E/AndroidRuntime(406):  at java.lang.reflect.Method.invokeNative(Native Method)
07-22 09:33:57.534: E/AndroidRuntime(406):  at java.lang.reflect.Method.invoke(Method.java:521)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
07-22 09:33:57.534: E/AndroidRuntime(406):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
07-22 09:33:57.534: E/AndroidRuntime(406):  at dalvik.system.NativeStart.main(Native Method)

And here is the code that threw the exception:

public DBEntrenamiento(Context context) {
    super(context);
}

public void addEntrenamiento(String nombre, String descripcion, String tipo) {


    SQLiteDatabase db = this.getWritableDatabase();
    if(db != null ){
        ContentValues values = new ContentValues();
        values.put(KEY_NOMBRE, nombre);
        values.put(KEY_DESCRIPCION, descripcion);
        values.put(KEY_TIPO, tipo);

        db.insert(Table, null, values);
        db.close();
    }
    else{
        String error = "error de apertura db";
    }

}

AND THIS IS THE HELPER

   public class bbdd extends SQLiteOpenHelper{



        private static String name = "android";
        private static int version = 1;
        private static CursorFactory cursorFactory = null;

        public bbdd(Context context){
         super(context,name,cursorFactory, version);
        }

        private String SQLCreateLogin = "CREATE TABLE login("
                + " id INTEGER PRIMARY KEY,"
                + " name TEXT,"
                + " email TEXT UNIQUE,"
                + " uid TEXT,"
                + " created_at TEXT" + ")";
        private String SQLCreateEntrenamiento = "CREATE TABLE entrenamiento("
                + " id INTEGER PRIMARY KEY,"
                + " nombre TEXT,"
                + " descripcion TEXT,"
                + " tipo TEXT,"
                + " created_at TEXT" + ")";

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL(SQLCreateLogin); 
        db.execSQL(SQLCreateEntrenamiento); 
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS entrenamiento");

        //Se crea la nueva versión de la tabla
        db.execSQL(SQLCreateEntrenamiento);

    }

}

No correct solution

OTHER TIPS

Try this:

SQLiteDatabase db;

make db variable as class (global) variable and initialize it in

public DBEntrenamiento(Context context) {
    super(context);
   db = this.getWritableDatabase();
}

and remove db initialization from method

public void addEntrenamiento(String nombre, String descripcion, String tipo) {
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top