/**
  * Operation to save user record into SQLite DB
  *
  * @param name username
  * @param score user score
  * @param overwrite overwrite the existing record or not
  */
 public void saveRecord(String name, int score, boolean overwrite) {
   if (overwrite) {
     writeIntoDB(name, score, overwrite);
   } else {
     List<UserScoreData> resultList = getAllUsersData(true);
     if ((resultList != null) && (resultList.size() > 0)) {
       boolean nameFound = false;
       Iterator iterator = resultList.iterator();
       while (iterator.hasNext()) {
         UserScoreData userdata = (UserScoreData) iterator.next();
         if (name.equalsIgnoreCase(userdata.getName())) {
           nameFound = true;
           break;
         }
       }
       if (nameFound) {
         ErrorResponse errorResponse = new ErrorResponse();
         errorResponse.setErrorCode(IAppConstants.ERROR_RESPONSE_DUPLICATE_ENTRY);
         errorResponse.setMessage("Duplicate Entry");
         mPresenterNotifier.PostNotification(
             IPresenterNotifier.NOTIFICATION_SAVE_RECORD, errorResponse);
       } else {
         writeIntoDB(name, score, overwrite);
       }
     } else {
       writeIntoDB(name, score, overwrite);
     }
   }
 }
  /** Returns highest score row from DB. */
  public void getHighestScore() {
    try {
      Dao<UserScoreData, Integer> usersScoreData = getHelper().getUserScoreData();
      QueryBuilder<UserScoreData, Integer> builder = usersScoreData.queryBuilder();
      builder.orderBy("score", false);
      UserScoreData result = usersScoreData.queryForFirst(builder.prepare());

      mPresenterNotifier.PostNotification(IPresenterNotifier.NOTIFICATION_HIGHEST_SCORE, result);
    } catch (SQLException e) {
      e.printStackTrace();
    }

    if (databaseHelper != null) {
      OpenHelperManager.releaseHelper();
      databaseHelper = null;
    }
  }
  /**
   * Add data into new row of DB. If data already exist it checks whether it needs to overwrite or
   * not.
   *
   * @param name user name
   * @param score user score
   * @param overwrite overwrite data or not if duplicate exist.
   */
  private void writeIntoDB(String name, int score, boolean overwrite) {
    UserScoreData userScore = new UserScoreData(name, score);
    try {
      final Dao<UserScoreData, Integer> userScoreData = getHelper().getUserScoreData();
      if (overwrite) {
        QueryBuilder<UserScoreData, Integer> query = userScoreData.queryBuilder();
        query.where().eq("name", name);
        UserScoreData sub = userScoreData.queryForFirst(query.prepare());
        userScoreData.delete(sub);
        userScoreData.create(userScore);
      } else {
        userScoreData.create(userScore);
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }

    mPresenterNotifier.PostNotification(IPresenterNotifier.NOTIFICATION_SAVE_RECORD, userScore);
  }
  /**
   * Returns all the data from Table in sorted order by score.
   *
   * @param isWriting isQuery purpose to write/update data
   * @return all data list in table
   */
  public List<UserScoreData> getAllUsersData(boolean isWriting) {
    List<UserScoreData> resultList = null;
    try {
      Dao<UserScoreData, Integer> usersScoreData = getHelper().getUserScoreData();
      QueryBuilder<UserScoreData, Integer> builder = usersScoreData.queryBuilder();
      builder.orderBy("score", false);
      resultList = usersScoreData.query(builder.prepare());
      if (!isWriting && (resultList.size() > 0)) {
        AllUsersRecord usersList = new AllUsersRecord();
        usersList.setUserScoreDataList(resultList);
        mPresenterNotifier.PostNotification(IPresenterNotifier.NOTIFICATION_ALL_RECORDS, usersList);
      }

    } catch (SQLException e) {
      e.printStackTrace();
    }

    if (databaseHelper != null) {
      OpenHelperManager.releaseHelper();
      databaseHelper = null;
    }
    return resultList;
  }