SQLiteDatabase.insert erzeugt "null object reference"?!

  • Antworten:2
  • Bentwortet
Android Anfänger
  • Forum-Beiträge: 6

15.11.2015, 17:10:49 via Website

Hallo zusammen,

ich häng an dem Problem, dass ein Datensatz nicht in die SQLightDB geschrieben wird bzw. bei der Insert-Operation immer die App mit der Fehlermeldung abschmiert:

 java.lang.RuntimeException: Unable to start activity......java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference

Ich bin ein Anfänger und ich weiß nicht, wie dieser Fehler richtig zu interpretieren ist bzw. der Fehler behoben werden kann, auch wenn ich schon diverse Threads dazu gelesen habe :-|

Der Fehler schein bei der Ausführung der Code-Zeile aufzutreten, da der Kommentar in der folgenden Zeile im logcat nicht mehr angezeigt wird:

 long insertId = database.insert(ItemDbHelper.TABLE_WG_LIST, null, values);

Mit der Methode soll der Datensatz erstellt werden:

  public ItemObject createItemObject() {
    String wg_titel = "ItemNew";
    String wg_text = "ItemText";
    int wg_categorie = 3;
    Log.d(LOG_TAG, "in createItemObject");
    ContentValues values = new ContentValues();

    values.put(ItemDbHelper.COLUMN_WG_TITEL, wg_titel);
    values.put(ItemDbHelper.COLUMN_WG_TEXT, wg_text);
    values.put(ItemDbHelper.COLUMN_WG_CATEGORIE, wg_categorie);

    Log.d(LOG_TAG, "in createItemObject, values erzeugt" + values.toString() + " " + ItemDbHelper.TABLE_WG_LIST);

    long insertId = database.insert(ItemDbHelper.TABLE_WG_LIST, null, values);

     Log.d(LOG_TAG, "in createItemObject, done");


    Cursor cursor = database.query(ItemDbHelper.TABLE_WG_LIST,
            columns, ItemDbHelper.COLUMN_WG_ID+ "=" + insertId,
            null, null, null, null);

    cursor.moveToFirst();
    ItemObject itemObject = cursorToItemObject(cursor);
    cursor.close();

    return itemObject;
}

Und hier ist die Klasse noch dazu:

public class ItemDataSource {

private static final String LOG_TAG = ItemDataSource.class.getSimpleName();

private SQLiteDatabase database;
private ItemDbHelper dbHelper;

private String[] columns = {
        ItemDbHelper.COLUMN_WG_ID,
        ItemDbHelper.COLUMN_WG_TITEL,
        ItemDbHelper.COLUMN_WG_TEXT,
        ItemDbHelper.COLUMN_WG_CATEGORIE
};


// Konstruktor
public ItemDataSource(Context context) {
    Log.d(LOG_TAG, "Unsere DataSource erzeugt jetzt den dbHelper.");
    dbHelper = new ItemDbHelper(context);
}

public void open() {
    Log.d(LOG_TAG, "Eine Referenz auf die Datenbank wird jetzt angefragt.");
    database = dbHelper.getWritableDatabase();
    Log.d(LOG_TAG, "Datenbank-Referenz erhalten. Pfad zur Datenbank: " + database.getPath());
}

public void close() {
    dbHelper.close();
    Log.d(LOG_TAG, "Datenbank mit Hilfe des DbHelpers geschlossen.");
}
  public ItemObject createItemObject() {
    String wg_titel = "ItemNew";
    String wg_text = "ItemText";
    int wg_categorie = 3;
    Log.d(LOG_TAG, "in createItemObject");
    ContentValues values = new ContentValues(); // ContentValues ist eine gegebene Variable

    values.put(ItemDbHelper.COLUMN_WG_TITEL, wg_titel);
    values.put(ItemDbHelper.COLUMN_WG_TEXT, wg_text);
    values.put(ItemDbHelper.COLUMN_WG_CATEGORIE, wg_categorie);

    Log.d(LOG_TAG, "in createItemObject, values erzeugt" + values.toString() + " " + ItemDbHelper.TABLE_WG_LIST);

    long insertId = database.insert(ItemDbHelper.TABLE_WG_LIST, null, values);



    Cursor cursor = database.query(ItemDbHelper.TABLE_WG_LIST,
            columns, ItemDbHelper.COLUMN_WG_ID+ "=" + insertId,
            null, null, null, null);

    cursor.moveToFirst();
    ItemObject itemObject = cursorToItemObject(cursor);
    cursor.close();

    return itemObject;
} ....

}

Für Tipps und Hinweis bin ich sehr dankbar, schönen Abend

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

15.11.2015, 17:15:30 via Website

Hallo,
diese Fehlermeldung besagt, dass dein database Objekt = null oder bessergesagt nicht gesetzt ist, denn du hast vergessen vor den benutzung open() aufzurufen.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Android Anfänger
  • Forum-Beiträge: 6

15.11.2015, 17:24:25 via Website

Pascal du Fuchs, vielen Dank. Du hattest wieder recht! Vor dem insert die open() Methode gesetzt und jetzt läuft das Ding durch, hurra.

Hatte ein laufenden Bsp und es versucht auf ein eigenes Projekt zu abstrahieren, aber da muss sich irgendwie der Hund eingeschlichen haben.

Danke nochmals und schönen Sonntag, VG ich

— geändert am 15.11.2015, 17:24:56

Antworten