SQLiteOpenHelper.getWriteableDatabase () Nullzeiger Ausnahme auf Android

Ich habe feines Glück mit SQLite mit geraden, direkten SQL in Android, aber das ist das erste Mal, dass ich eine DB in einem ContentProvider verpacke. Ich getWritableDatabase() immer eine Null-Pointer-Ausnahme beim Aufruf von getWritableDatabase() oder getReadableDatabase() . Ist das nur ein dummer Fehler, den ich mit Initialisierungen in meinem Code gemacht habe oder gibt es ein größeres Problem?

 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 < 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); } } } 

Wie immer, danke für die Hilfe!

  • Drag & Drop in Xamarin Formen
  • Android Wie funktioniert notifyDataSetChanged () -Methode und ListViews?
  • Wo finde ich API Key und API Geheimnis für Facebook?
  • Schiebelappen in den Aktionsleisten-Tabs
  • NotificationCompat android - wie man nur großes Icon ohne klein zeigt
  • Wie man das Überlaufmenü in der Actionbar mit Actionbarsherlock auf <4.0-Geräten
  • Nicht sicher, ob dieses Detail hilft, aber hier ist LogCat zeigt die Ausnahme:

    Entfernte tote ImageShack-Link

  • Ist es möglich, Code in das Android Manifest einzufügen / zu importieren?
  • Anzeige Anzeige in AndEngine
  • Internet-Check, wo man bei der Verwendung von MVP, RX und Retrofit platzieren kann
  • Android VideoView stoppen Streaming nach bestimmten Zeit
  • Nicht in der Lage, Video in Android Web View zu sehen
  • Wie mache ich einen Toast aus einer Nicht-Aktivitätsklasse?
  • 7 Solutions collect form web for “SQLiteOpenHelper.getWriteableDatabase () Nullzeiger Ausnahme auf Android”

    Eher, als:

     databaseHelper = new DatabaseProvider.DatabaseHelper(getContext()); 

    Versuchen:

     databaseHelper = new DatabaseProvider.DatabaseHelper(this); 

    Und sehen, ob das hilft.

    Wenn es nicht, könnten Sie die NullPointerException Stack Trace?

    Dieser Fehler ist fast sicher, dass ein ungültiger Kontext eingegangen ist:

     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    Ich hatte gerade dieses Problem mit der SQLite nullpointerexception in einer Nicht-Aktivität und das Problem war, dass es einen ungültigen Kontext hatte.

    Meine Verlegenheit hat den Kontext bei onCreate statt des Konstruktors übergeben. Versuchen Sie, einen Kontext von einem anderen Ort zu finden, um getApplicationContext() .

    Versuchen Sie, getWritableDatabase() in irgendeiner Zeit zu verwenden, nachdem Sie anfänglich der Helfer Sie NullPointerException weil die Datenbank nicht vollständig vorbereitet wurde und nicht das im ui-Thread tun, oder es kann ANR verursachen

    Ich hatte gerade dieses Problem und erkannte, dass es ein bisschen ein roter Hering war.

    Mein Problem stammte aus der Art, wie ich den ContentProvider benutzte.

    Ich habe eigentlich direkt auf den ContentProvider zugreifen können, anstatt über den ContentResolver. Es ist im Wesentlichen ein einfacher Weg, um aufzusteigen, wenn Ihr neues mit ContentProviders verwenden.

    Ich hoffe, das hilft 🙂

    Vergewissern Sie sich, wenn Sie das AVD erstellen, geben Sie einen bestimmten SD-Kartenplatz an. Ich hatte das gleiche Problem und das hat es gelöst. Wenn dies nicht hilft, können Sie auch versuchen, den Emulator mit -wisch-Daten-Option zu starten.

    Ich habe diese gleiche NullPointerException Fehler, wenn getReadableDatabase () wird in der Abfrage (), weil ich falsch Abfrage meiner Content-Anbieter. Ich kann nichts falsch sehen, wie du deine Datenbank konstruierst. GetContext () sollte Ihnen das entsprechende Kontextobjekt geben. Allerdings würde ich darauf achten, wie Sie Ihre Anfragen an den Content Provider machen. Sie sollten sicherstellen, dass Sie einen gültigen Verweis auf Ihren Content-Resolver haben (zB durch Aufruf von getContentResolver (). Abfrage (..)) und verwendet das, um die Abfrage auszuführen.

    Das Android ist ein Google Android Fan-Website, Alles über Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.