-1

I have created an app that stores certain data in database(SQLite) but i am facing a problem that while storing the data i get NullPointerException, (Logcat attached). the problem i m facing is at SQLiteDatabse db=this.getWritableDatabase();

I have searched for almost all solution but none helped,If anyone could help it would be a great help.

Thanks

package com.example.neuronsdk;

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


public class DatabaseHandler extends SQLiteOpenHelper {
 
 private static final int DATABASE_VERSION = 2;
 private static final String DATABASE_NAME = "NeuronDatabase";
 
 private static final String TABLE_EVENTS = "Events";
 private static final String TAG = "DatabaseHandler.class";
 private static final String KEY_ID = "id";
 private static final String KEY_EVENTS = "eventsText";
 private static final String KEY_START_TIME="start_time";
 private static final String KEY_END_TIME="end_time";
 
 String url="www.neuronme.com/android_sdk_data/";
 
 SQLiteDatabase dbHelper=null;
 DatabaseHandler dbh;
 private Context context;
 
 
 
 
 
 private static final String NEURON_DATABASE ="CREATE TABLE " + TABLE_EVENTS + "("   +
                KEY_EVENTS + " TEXT NOT NULL, " + KEY_START_TIME + " INTEGER," +  
                KEY_END_TIME + " INTEGER );";     
 public DatabaseHandler(Context context) {
  super(context, DATABASE_NAME, null, DATABASE_VERSION);
  this.context=context;
 }
 
 @Override
 public void onCreate(SQLiteDatabase db) {
  // TODO Auto-generated method stub
  db.execSQL(NEURON_DATABASE);
  Log.d(TAG, "Database Created"); 
  }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // TODO Auto-generated method stub
   db.execSQL("DROP TABLE IF EXISTS " + TABLE_EVENTS);
   this.onCreate(db);
 }
 
  public void open() throws SQLException {
  // close();
  //dbh=new DatabaseHandler(this.context);
  dbHelper = this.getWritableDatabase();
     }
 
 public void addEvent(String eventText){
  ContentValues values = new ContentValues();
  Log.d("Database", "Adding value in database"+ eventText);
  open();
  if(eventText != null)
  {
  values.put(KEY_EVENTS, eventText);
  dbHelper.insert(TABLE_EVENTS, null, values);
  close();
  }
 }
 
 public void addStartTime(Long startTime){
  ContentValues values = new ContentValues();
  Log.d("Database", "Adding start time in database"+ startTime);
  close();
  //dbHelper=this.getWritableDatabase();
  values.put(KEY_START_TIME, startTime);
  dbHelper.insert(TABLE_EVENTS, null, values); 
  close();
 }
 
 public void addEndTime(Long endTime){
  ContentValues values = new ContentValues();
  Log.d("Database", "Adding End time in database"+ endTime);
  close();
 // dbHelper=getWritableDatabase();
  values.put(KEY_END_TIME, endTime);
  dbHelper.insert(TABLE_EVENTS, null, values);
  close();
  }
}

Error Report of Logcat is :

07-16 07:08:32.435: E/AndroidRuntime(1869): FATAL EXCEPTION: main
07-16 07:08:32.435: E/AndroidRuntime(1869): Process: com.example.test_application, PID: 1869
07-16 07:08:32.435: E/AndroidRuntime(1869): java.lang.NullPointerException
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at com.example.neuronsdk.DatabaseHandler.open(DatabaseHandler.java:59)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at com.example.neuronsdk.DatabaseHandler.addEvent(DatabaseHandler.java:72)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at com.example.neuronsdk.NeuronActivity.onClick(NeuronActivity.java:28)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at com.example.test_application.MainActivity$1.onClick(MainActivity.java:47)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.view.View.performClick(View.java:4438)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.view.View$PerformClick.run(View.java:18422)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.os.Handler.handleCallback(Handler.java:733)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.os.Looper.loop(Looper.java:136)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at android.app.ActivityThread.main(ActivityThread.java:5017)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at java.lang.reflect.Method.invokeNative(Native Method)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at java.lang.reflect.Method.invoke(Method.java:515)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-16 07:08:32.435: E/AndroidRuntime(1869):     at dalvik.system.NativeStart.main(Native Method)
Karan Khurana
  • 575
  • 8
  • 20

3 Answers3

1

You're passing null for a Context here:

Context context = null;
//this.context=context;
dbh=new DatabaseHandler(context);

You need to pass in a valid Context such as Application or Activity.

laalto
  • 150,114
  • 66
  • 286
  • 303
  • If the exception is still the same, you haven't passed in a valid context. – laalto Jul 16 '15 at 13:00
  • public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); this.context=context; } – Karan Khurana Jul 16 '15 at 13:08
  • public void open() throws SQLException { close(); dbh=new DatabaseHandler(this.context); dbHelper = dbh.getWritableDatabase(); } – Karan Khurana Jul 16 '15 at 13:08
  • 1
    That doesn't show where the context is coming to your constructor in the first place. Also, creating a new `DatabaseHandler` instance within an instance method seems redundant - in order to call the `open()` instance method you need an object already created. – laalto Jul 16 '15 at 13:12
1

first of all in your constructor just assign the context value

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context=context;
}

then in your open method just replace

dbh=new DatabaseHandler(context);

with

dbh=new DatabaseHandler(this.context);
Vishwajit Palankar
  • 3,033
  • 3
  • 28
  • 48
1

Change your constructor to this:

public DatabaseHandler(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    this.context = context;
}

Change your open() method to this:

public void open() throws SQLException {
         close();
       this.getWritableDatabase();
    }

Implement closeDB() method

public void closeDB() {
    SQLiteDatabase db = this.getReadableDatabase();
    if (db != null && db.isOpen())
        db.close();
}

Use the application context and use an instance if it already exists. That is, instead of calling constructor, call the instance. See below:

public static DatabaseHandler getInstance(Context ctx) {

    // Use the application context, which will ensure that you
    // don't accidentally leak an Activity's context.
    if (mInstance == null) {
        mInstance = new DatabaseHandler(ctx.getApplicationContext());
    }
    return mInstance;
}
ifiok
  • 499
  • 4
  • 14