public static int deleteById(SQLiteDatabase db, Refuel rf) {
   /*
   We can just delete the parent expense row.
   The ON DELETE CASCADE clause, will make sure the
   refuel row is also deleted.
    */
   return ExpenseTable.deleteById(db, rf.getExpense());
 }
  public static long save(SQLiteDatabase db, Refuel rf) {
    ContentValues cv = new ContentValues();
    cv.put(ODOMETER, rf.getOdometer());
    cv.put(LITRE, rf.getLitre());
    cv.put(RATE, rf.getRate());
    cv.put(PUMP_NAME, rf.getPumpName());
    cv.put(FULL_TANK, rf.isFullTank());
    rf.getExpense().setDesc("Refuel at " + rf.getPumpName());
    rf.getExpense().setType("refuel");
    cv.put(EXP_ID, ExpenseTable.save(db, rf.getExpense()));

    return db.insert(TABLE_NAME, null, cv);
  }
  public static int update(SQLiteDatabase db, Refuel rf) {
    try {
      rf.getExpense().setDesc("Refuel at " + rf.getPumpName());
      rf.getExpense().setType("refuel");
      ExpenseTable.update(db, rf.getExpense());

      ContentValues cv = new ContentValues();
      cv.put(ODOMETER, rf.getOdometer());
      cv.put(LITRE, rf.getLitre());
      cv.put(RATE, rf.getRate());
      cv.put(PUMP_NAME, rf.getPumpName());
      cv.put(FULL_TANK, rf.isFullTank());
      cv.put(EXP_ID, rf.getExpense().getId());

      return db.update(TABLE_NAME, cv, ID + "=" + rf.getId(), null);
    } catch (NullPointerException e) {
      e.printStackTrace();
      return 0;
    }
  }