private void insert() {
    if (mID >= 0) {
      LOGGER.warning("message already in db, ID: " + mID);
      return;
    }
    Database db = Database.getInstance();

    List<Object> values = new LinkedList<>();
    values.add(mThread.getID());
    values.add(mDir);
    values.add(mUser.getID());
    values.add(mJID);
    values.add(Database.setString(mXMPPID));
    values.add(mDate);
    values.add(mReceiptStatus);
    // i simply don't like to save all possible content explicitly in the
    // database, so we use JSON here
    values.add(mContent.toJSONString());
    values.add(mCoderStatus.getEncryption());
    values.add(mCoderStatus.getSigning());
    values.add(mCoderStatus.getErrors());
    values.add(mServerError.toJSON());
    values.add(mServerDate);

    int id = db.execInsert(TABLE, values);
    if (id <= 0) {
      LOGGER.log(Level.WARNING, "db, could not insert message");
      mID = -2;
      return;
    }
    mID = id;
  }