@Override
  public long readWholeData() throws SQLException {
    long start = System.nanoTime();
    Cursor c = null;
    try {
      SQLiteDatabase db = mHelper.getReadableDatabase();
      List<Message> messages = new LinkedList<Message>();
      c = db.query(Message.TABLE_NAME, Message.PROJECTION, null, null, null, null, null);

      while (c != null && c.moveToNext()) {

        Message newMessage = new Message();
        newMessage.setChannelId(c.getLong(c.getColumnIndex(Message.CHANNEL_ID)));
        newMessage.setClientId(c.getLong(c.getColumnIndex(Message.CLIENT_ID)));
        newMessage.setCommandId(c.getLong(c.getColumnIndex(Message.COMMAND_ID)));
        newMessage.setContent(c.getString(c.getColumnIndex(Message.CONTENT)));
        newMessage.setCreatedAt(c.getInt(c.getColumnIndex(Message.CREATED_AT)));
        newMessage.setSenderId(c.getLong(c.getColumnIndex(Message.SENDER_ID)));
        newMessage.setSortedBy(c.getDouble(c.getColumnIndex(Message.SORTED_BY)));

        messages.add(newMessage);
      }
      Log.d(SQLiteExecutor.class.getSimpleName(), "Read, " + messages.size() + " rows");
    } finally {
      if (c != null) {
        c.close();
      }
    }
    return System.nanoTime() - start;
  }
  @Override
  public long readIndexedField() throws SQLException {
    long start = System.nanoTime();
    Cursor c = null;
    try {
      SQLiteDatabase db = mHelper.getReadableDatabase();
      String selection = Message.COMMAND_ID + "=?";
      String[] selectionArgs = new String[] {String.valueOf(LOOK_BY_INDEXED_FIELD)};
      c =
          db.query(
              Message.TABLE_NAME, Message.PROJECTION, selection, selectionArgs, null, null, null);

      if (c != null && c.moveToFirst()) {
        Message newMessage = new Message();
        newMessage.setChannelId(c.getLong(c.getColumnIndex(Message.CHANNEL_ID)));
        newMessage.setClientId(c.getLong(c.getColumnIndex(Message.CLIENT_ID)));
        newMessage.setCommandId(c.getLong(c.getColumnIndex(Message.COMMAND_ID)));
        newMessage.setContent(c.getString(c.getColumnIndex(Message.CONTENT)));
        newMessage.setCreatedAt(c.getInt(c.getColumnIndex(Message.CREATED_AT)));
        newMessage.setSenderId(c.getLong(c.getColumnIndex(Message.SENDER_ID)));
        newMessage.setSortedBy(c.getDouble(c.getColumnIndex(Message.SORTED_BY)));

        Log.d(SQLiteExecutor.class.getSimpleName(), "Read, " + c.getCount() + " rows");
      }
    } finally {
      if (c != null) {
        c.close();
      }
    }
    return System.nanoTime() - start;
  }
  @Override
  public long writeWholeData() throws SQLException {
    List<User> users = new LinkedList<User>();
    for (int i = 0; i < NUM_USER_INSERTS; i++) {
      User newUser = new User();
      newUser.setLastName(getRandomString(10));
      newUser.setFirstName(getRandomString(10));

      users.add(newUser);
    }

    List<Message> messages = new LinkedList<Message>();
    for (int i = 0; i < NUM_MESSAGE_INSERTS; i++) {
      Message newMessage = new Message();
      newMessage.setCommandId(i);
      newMessage.setSortedBy(System.nanoTime());
      newMessage.setContent(Util.getRandomString(100));
      newMessage.setClientId(System.currentTimeMillis());
      newMessage.setSenderId(Math.round(Math.random() * NUM_USER_INSERTS));
      newMessage.setChannelId(Math.round(Math.random() * NUM_USER_INSERTS));
      newMessage.setCreatedAt((int) (System.currentTimeMillis() / 1000L));

      messages.add(newMessage);
    }

    long start = System.nanoTime();
    SQLiteDatabase db = mHelper.getWritableDatabase();

    try {
      db.beginTransaction();

      for (User user : users) {
        db.insert(User.TABLE_NAME, null, user.prepareForInsert());
      }
      Log.d(SQLiteExecutor.class.getSimpleName(), "Done, wrote " + NUM_USER_INSERTS + " users");

      for (Message message : messages) {
        db.insert(Message.TABLE_NAME, null, message.prepareForInsert());
      }
      Log.d(
          SQLiteExecutor.class.getSimpleName(), "Done, wrote " + NUM_MESSAGE_INSERTS + " messages");
      db.setTransactionSuccessful();
    } finally {
      db.endTransaction();
    }
    return System.nanoTime() - start;
  }