-1

I can open my Datenbase but if I try to insert an item my application crashes. Insert the item only to my ListView works.

I create a new Object in another Activity and take the Values in an Intent. But when I start the intent and go back to the Main/List_page Activity my App crashes. Without the Database, the application runs.

Heres my codes: ReceptListAdapter.java:

public class ReceptListDatabase {

private static final String DATABASE_NAME = "receptlist.db";
private static final int DATABASE_VERSION = 1;

private static final String DATABASE_TABLE = "receptlistitems";

public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_KATEGORY = "kategory";
public static final String KEY_INGREDIENTS = "ingredients";
public static final String KEY_DIRECTIONS = "ingredients";


public static final int COLUMN_NAME_INDEX = 1;
public static final int COLUMN_KATEGORY_INDEX = 2;
public static final int COLUMN_INGREDIENTS_INDEX = 3;
public static final int COLUMN_DIRECTIONS_INDEX = 4;

private ReceptDBOpenHelper dbHelper;

private SQLiteDatabase DB;

public ReceptListDatabase(Context context) {
    dbHelper = new ReceptDBOpenHelper(context, DATABASE_NAME, null,
            DATABASE_VERSION);
}

public void open() throws SQLException {
    try {
        db = dbHelper.getWritableDatabase();
    } catch (SQLException e) {
        db = dbHelper.getReadableDatabase();
    }
}

public void close() {
    db.close();
}

public long insertReceptItem(ListItem item) {
    ContentValues itemValues = new ContentValues();
    itemValues.put(KEY_NAME, item.getName());
    itemValues.put(KEY_KATEGORY,item.getKategory());
    itemValues.put(KEY_INGREDIENTS, item.getIngredients());
    itemValues.put(KEY_DIRECTIONS, item.getDirection());
    return db.insert(DATABASE_TABLE, null, itemValues);
}

public void removeReceptItem(ListItem item) {

    String toDelete = KEY_NAME + "=?";
    String[] deleteArguments = new String[]{item.getName()};
    db.delete(DATABASE_TABLE, toDelete, deleteArguments);

}

public ArrayList<ListItem> getAllReceptItems() {
    ArrayList<ListItem> items = new ArrayList<ListItem>();
    Cursor cursor = db.query(DATABASE_TABLE, new String[] { KEY_ID,
            KEY_NAME, KEY_KATEGORY, KEY_INGREDIENTS, KEY_DIRECTIONS, null}, null, null, null, null, null);
    if (cursor.moveToFirst()) {
        do {
            String name = cursor.getString(COLUMN_NAME_INDEX);
            String kategory = cursor.getString(COLUMN_KATEGORY_INDEX);
            String ingredients = cursor.getString(COLUMN_INGREDIENTS_INDEX);
            String directions = cursor.getString(COLUMN_DIRECTIONS_INDEX);

            items.add(new ListItem(name, kategory, ingredients, directions, null));

        } while (cursor.moveToNext());
    }
    return items;
}

private class ReceptDBOpenHelper extends SQLiteOpenHelper {
    private static final String DATABASE_CREATE = "create table "
            + DATABASE_TABLE + " (" + KEY_ID
            + " integer primary key autoincrement, " + KEY_NAME
            + " text not null, " + KEY_KATEGORY
            + " text, " + KEY_INGREDIENTS
            + " text not null, " + KEY_DIRECTIONS
            + " text not null);";


        public ReceptDBOpenHelper(Context c, String dbname,
                            SQLiteDatabase.CursorFactory factory, int version) {
        super(c, dbname, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

And my Main Activity:

public class List_Page extends Activity {


private ListViewAdapter adapter;
private ArrayList<ListItem> itemList;
private ListView list;
private DatabaseAdapter receptDB;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_list);
    setupButton();
    setupListView();
    addObject();
    setupDatabase();

}

private void setupDatabase() {
    receptDB = new DatabaseAdapter(this);
    receptDB.open();
}


private void setupButton() {
    Button addItemButton = (Button) findViewById(R.id.addItemButton);
    addItemButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            buttonClicked();
        }
    });
}

private void buttonClicked() {
    //get EditText
    Intent newItemIntent = new Intent(List_Page.this, Add_Object.class);
    startActivity(newItemIntent);
    finish();
}

private void setupListView() {
    itemList = new ArrayList<ListItem>();
    adapter = new ListViewAdapter(List_Page.this, itemList);
    list = (ListView) findViewById(R.id.listItem);
    list.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
        @Override
        public boolean onItemLongClick(AdapterView<?> parent, View view,
                                       int position, long id) {
            //fehler bei removeTaskAtPosition(position);
            return true;
        }
    });
    View header = ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.activity_list_item, null);
    list.addHeaderView(header);
    list.setAdapter(adapter);

}

private void addObject(){
    Intent intent = getIntent();
    if (intent.hasExtra(Constants.KEY_RECEPT_NAME)) {
        String name = intent.getExtras().getString(Constants.KEY_RECEPT_NAME);
        String kategory = intent.getExtras().getString(Constants.KEY_KATEGORY);
        String ingredients = intent.getExtras().getString(Constants.KEY_INGREDIENTS);
        String directions = intent.getExtras().getString(Constants.KEY_DIRECTIONS);
        Bitmap image = (Bitmap) intent.getParcelableExtra(Constants.KEY_IMAGE);
        ListItem newObject = new ListItem(name,kategory,ingredients,directions, image);
        itemList.add(newObject);
        receptDB.insertReceptItem(newObject);
        //refreshArrayList();
    }
}

    private void refreshArrayList() {
    ArrayList tempList = receptDB.getAllReceptItems();
    itemList.clear();
    itemList.addAll(tempList);
    adapter.notifyDataSetChanged();
}

private void removeTaskAtPosition(int position) {
    if (itemList.get(position) != null) {
        receptDB.removeReceptItem(itemList.get(position));
        refreshArrayList();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onDestroy() {
    super.onDestroy();
    receptDB.close();
}

}

Logcat:

08-12 15:37:00.743 22879-22879/de.ur.mi.android.excercises.starter E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                     Process: de.ur.mi.android.excercises.starter, PID: 22879
                                                                                     java.lang.RuntimeException: Unable to start activity ComponentInfo{de.ur.mi.android.excercises.starter/de.ur.mi.android.excercises.starter.List_Page}: java.lang.NullPointerException: Attempt to invoke virtual method 'long de.ur.mi.android.excercises.starter.DatabaseAdapter.insertReceptItem(de.ur.mi.android.excercises.starter.domain.ListItem)' on a null object reference
                                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2720)
                                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2781)
                                                                                         at android.app.ActivityThread.-wrap12(ActivityThread.java)
                                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1508)
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                         at android.os.Looper.loop(Looper.java:241)
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:6274)
                                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
                                                                                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'long de.ur.mi.android.excercises.starter.DatabaseAdapter.insertReceptItem(de.ur.mi.android.excercises.starter.domain.ListItem)' on a null object reference
                                                                                         at de.ur.mi.android.excercises.starter.List_Page.addObject(List_Page.java:99)
                                                                                         at de.ur.mi.android.excercises.starter.List_Page.onCreate(List_Page.java:40)
                                                                                         at android.app.Activity.performCreate(Activity.java:6720)
                                                                                         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
                                                                                         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2673)
                                                                                         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2781) 
                                                                                         at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                                                                                         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1508) 
                                                                                         at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                         at android.os.Looper.loop(Looper.java:241) 
                                                                                         at android.app.ActivityThread.main(ActivityThread.java:6274) 
                                                                                         at java.lang.reflect.Method.invoke(Native Method) 
                                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Sabrina H
  • 1
  • 4

1 Answers1

0

In your Activity's onCreate you are calling addObject() before calling setupDatabase(). Only inside setupDatabase() you are initialising receptDB instance.

But you are accessing that receptDb inside addObject() method.

receptDB.insertReceptItem(newObject);

So during that time, your receptDB has null reference and so you are getting NullPointerException.

So swap the below two lines from,

addObject();
setupDatabase();

to this:

setupDatabase();
addObject();
Bob
  • 13,447
  • 7
  • 35
  • 45