title: SQLiteOpenHelper.getWriteableDatabase() null pointer exception on Android
body: <p>I've had fine luck using SQLite with straight, direct SQL in Android, but this is the first time I'm wrapping a DB in a ContentProvider. I keep getting a null pointer exception when calling <code>getWritableDatabase()</code> or <code>getReadableDatabase()</code>. Is this just a stupid mistake I've made with initializations in my code or is there a bigger issue?</p>
  
  <pre><code>public class DatabaseProvider extends ContentProvider {
    ...
    private DatabaseHelper                   databaseHelper;
    private SQLiteDatabase                   db;
    ...
    @Override
    public boolean onCreate() {
      databaseHelper = new DatabaseProvider.DatabaseHelper(getContext());
      return (databaseHelper == null) ? false : true;
    }
    ...
    @Override
    public Uri insert(Uri uri, ContentValues values) {   
      db = databaseHelper.getWritableDatabase(); // NULL POINTER EXCEPTION HERE
      ...
    }
    private static class DatabaseHelper extends SQLiteOpenHelper {
      public static final String DATABASE_NAME = "cogsurv.db";
      public static final int DATABASE_VERSION = 1;
  
      public static final String[] TABLES = {
        "people", 
        "travel_logs", 
        "travel_fixes",
        "landmarks", 
        "landmark_visits",
        "direction_distance_estimates" 
      };
  
      // people._id does not AUTOINCREMENT, because it's set based on server's people.id
      public static final String[] CREATE_TABLE_SQL = {
        "CREATE TABLE people (_id INTEGER PRIMARY KEY," + 
                   "server_id INTEGER," +
                   "name VARCHAR(255)," +
                   "email_address VARCHAR(255))",
        "CREATE TABLE travel_logs (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                                  "server_id INTEGER," +
                                  "person_local_id INTEGER," +
                                  "person_server_id INTEGER," +
                                  "start DATE," +
                                  "stop DATE," +
                                  "type VARCHAR(15)," +
                                  "uploaded VARCHAR(1))",
        "CREATE TABLE travel_fixes (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                                   "datetime DATE, " +
                                   "latitude DOUBLE, " +
                                   "longitude DOUBLE, " +
                                   "altitude DOUBLE," +
                                   "speed DOUBLE," +
                                   "accuracy DOUBLE," +
                                   "travel_mode VARCHAR(50), " +
                                   "person_local_id INTEGER," +
                                   "person_server_id INTEGER," +
                                   "travel_log_local_id INTEGER," +
                                   "travel_log_server_id INTEGER," +
                                   "uploaded VARCHAR(1))",
        "CREATE TABLE landmarks (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                                "server_id INTEGER," +
                                "name VARCHAR(150)," +
                                "latitude DOUBLE," +
                                "longitude DOUBLE," +
                                "person_local_id INTEGER," +
                                "person_server_id INTEGER," +
                                "uploaded VARCHAR(1))",
        "CREATE TABLE landmark_visits (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                                      "server_id INTEGER," +
                                      "person_local_id INTEGER," +
                                      "person_server_id INTEGER," +
                                      "landmark_local_id INTEGER," +
                                      "landmark_server_id INTEGER," +
                                      "travel_log_local_id INTEGER," +
                                      "travel_log_server_id INTEGER," +
                                      "datetime DATE," +
                                      "number_of_questions_asked INTEGER," +
                                      "uploaded VARCHAR(1))",
        "CREATE TABLE direction_distance_estimates (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                                                   "server_id INTEGER," +
                                                   "person_local_id INTEGER," +
                                                   "person_server_id INTEGER," +
                                                   "travel_log_local_id INTEGER," +
                                                   "travel_log_server_id INTEGER," +
                                                   "landmark_visit_local_id INTEGER," +
                                                   "landmark_visit_server_id INTEGER," +
                                                   "start_landmark_local_id INTEGER," +
                                                   "start_landmark_server_id INTEGER," +
                                                   "target_landmark_local_id INTEGER," +
                                                   "target_landmark_server_id INTEGER," +
                                                   "datetime DATE," +
                                                   "direction_estimate DOUBLE," +
                                                   "distance_estimate DOUBLE," +
                                                   "uploaded VARCHAR(1))"
      };
  
      public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        Log.v(Constants.TAG, "DatabaseHelper()");
      }
  
      @Override
      public void onCreate(SQLiteDatabase db) {
        Log.v(Constants.TAG, "DatabaseHelper.onCreate() starting");
  
        // create the tables
        int length = CREATE_TABLE_SQL.length;
        for (int i = 0; i &lt; length; i++) {
          db.execSQL(CREATE_TABLE_SQL[i]);
        }
        Log.v(Constants.TAG, "DatabaseHelper.onCreate() finished");
      }
  
      @Override
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        for (String tableName : TABLES) {
          db.execSQL("DROP TABLE IF EXISTS" + tableName);
        }
        onCreate(db);
      }
    }
  }
  </code></pre>
  
  <p>As always, thanks for the assistance!</p>
  
  <p>--</p>
  
  <p>Not sure if this detail helps, but here's LogCat showing the exception:</p>
  
  <p><em>removed dead ImageShack link</em></p>