@Override
  public DBFriendGroupMapping findByAccount(String account) {
    db = getTransactionDB();
    Cursor cursor =
        db.rawQuery(
            "SELECT * FROM "
                + DBColumns.FRIEND_STATE_TABLE_NAME
                + " WHERE "
                + DBColumns.FRIEND_STATE_ACCOUNT
                + "=?",
            new String[] {account});
    DBFriendGroupMapping mapping = null;
    if (cursor.moveToFirst()) {
      // 查找user
      String userAccount =
          cursor.getString(cursor.getColumnIndex(DBColumns.FRIEND_STATE_USER_ACCOUNT));
      DBUser user = userDao.findByAccount(userAccount);

      // 查找friendgroup
      String friendGroupAccount =
          cursor.getString(cursor.getColumnIndex(DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT));
      DBFriendGroup friendGroup = fgDao.findByAccount(friendGroupAccount);

      mapping = DBObjectHelper.getDB3FriendGroupMapping(user, friendGroup, cursor);
    }
    cursor.close();

    return mapping;
  }
  @Override
  public List<DBUser> findByFriendGroup(DBFriendGroup friendGroup) {
    db = getTransactionDB();

    Cursor cursor =
        db.rawQuery(
            "SELECT "
                + DBColumns.FRIEND_STATE_USER_ACCOUNT
                + " FROM "
                + DBColumns.FRIEND_STATE_TABLE_NAME
                + " WHERE "
                + DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT
                + "=?",
            new String[] {friendGroup.getAccount()});
    int i = 0;
    String[] us = new String[cursor.getCount()];
    while (cursor.moveToNext()) {
      us[i++] = cursor.getString(0);
    }
    cursor.close();

    List<DBUser> users = new ArrayList<DBUser>();
    for (int j = 0; j < us.length; j++) {
      users.add(userDao.findByAccount(us[j]));
    }

    return users;
  }
  @Override
  // public synchronized void update(String userAccount, XMPPUser contact) {
  public void update(String userAccount, XMPPUser contact) {
    db = getTransactionDB();

    synchronized (synchObj) {

      // 是否存在
      DBUser user = userDao.findByAccount(userAccount);
      if (user == null) {
        return;
      }

      DBUser ct = userDao.findByName(contact.getJid());
      if (ct == null) {
        add(userAccount, contact);

        return;
      }

      // 查找group,不存在会创建新的分组
      String group = contact.getGroup();
      DBFriendGroup fg = fgDao.find(userAccount, group);

      DBFriendGroupMapping mp = new DBFriendGroupMapping();
      mp.setUser(ct);
      mp.setFriendGroup(fg);
      mp.setLoginState(contact.getStatusMode());
      mp.setRemark(contact.getNickname());

      // 查找mapping中是否存在
      DBFriendGroupMapping mapping = find(userAccount, ct.getAccount());
      if (mapping != null) {
        // 更新
        mp.setAccount(mapping.getAccount());
        update(mp);
      } else {
        // 不存在,添加
        String acc = Integer.parseInt(getMaxAccount()) + 1 + "";
        mp.setAccount(acc);
        add(mp);
      }
    }
  }
  @Override
  // public synchronized void add(String account, XMPPUser contact) {
  public void add(String account, XMPPUser contact) {
    db = getTransactionDB();

    synchronized (synchObj) {

      // 查找group
      String group = contact.getGroup();
      DBFriendGroup fg = fgDao.find(account, group);

      // 查找contact
      String jid = contact.getJid();
      DBUser ct = userDao.findByName(jid);
      if (ct == null) {
        // 添加contact
        // 查找account
        String ua = userDao.findMaxAccount();
        ua = Integer.parseInt(ua) + 1 + "";
        ct = new DBUser();
        ct.setAccount(ua);
        ct.setNickname(jid);
        // ct.setState(contact.getStatusMode());
        ct.setDesp(contact.getStatusMessage());
        ct.setRegisterTime(new Date().getTime());
        userDao.add(ct);
      }

      // 是否已经存在,add(mapping)中会检查

      // 添加mapping
      DBFriendGroupMapping mapping = new DBFriendGroupMapping();
      mapping.setFriendGroup(fg);
      mapping.setUser(ct);
      mapping.setRemark(contact.getNickname());
      mapping.setLoginState(contact.getStatusMode());
      String ac = Integer.parseInt(getMaxAccount()) + 1 + "";
      mapping.setAccount(ac);
      add(mapping);
    }
  }
  @Override
  public int add(DBFriendGroupMapping mapping) {
    db = getTransactionDB();

    // 查找user
    DBUser user = userDao.findByAccount(mapping.getUser().getAccount());
    if (user == null) {
      return DBColumns.ERROR_USER_NOT_FOUND;
    }

    // 查找group
    DBFriendGroup fg = fgDao.findByAccount(mapping.getFriendGroup().getAccount());
    if (fg == null) {
      fgDao.add(mapping.getFriendGroup());
    }

    // 是否已经存在
    if (isExists(mapping.getUser().getAccount(), mapping.getFriendGroup().getAccount())) {
      return DBColumns.ERROR_FRIEND_STATE_EXISTS;
    }

    // 添加
    db.execSQL(
        "INSERT INTO "
            + DBColumns.FRIEND_STATE_TABLE_NAME
            + "("
            + DBColumns.FRIEND_STATE_ACCOUNT
            + ","
            + DBColumns.FRIEND_STATE_USER_ACCOUNT
            + ","
            + DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT
            + ","
            + DBColumns.FRIEND_STATE_LOGIN_STATE
            + ","
            + DBColumns.FRIEND_STATE_LOGIN_CHANNEL
            + ","
            + DBColumns.FRIEND_STATE_POSITION
            + ","
            + DBColumns.FRIEND_STATE_REMARK
            + ") VALUES(?,?,?,?,?,?,?)",
        new String[] {
          mapping.getAccount(),
          mapping.getUser().getAccount(),
          mapping.getFriendGroup().getAccount(),
          mapping.getLoginState() + "",
          mapping.getLoginChannel() + "",
          mapping.getPosition() + "",
          mapping.getRemark()
        });

    return DBColumns.RESULT_OK;
  }
  @Override
  public void delete(String userAccount, String jid) {
    db = getTransactionDB();

    DBUser contact = userDao.findByName(jid);
    if (contact == null) {
      return;
    }

    // 查找对应的account
    // select fs.[account] from friend_state fs,friend_group fg where
    // fs.[user_account]='100003' AND fs.[friend_group_account]=fg.[account]
    // and fg.[user_account]='100000'
    DBFriendGroupMapping mapping = find(userAccount, contact.getAccount());
    delete(mapping);
    // db.execSQL("DELETE * FROM " + DBColumns., new Object[]{});
  }
  @Override
  public int delete(DBUser user) {
    db = getTransactionDB();

    DBUser u = userDao.findByAccount(user.getAccount());
    if (u == null) {
      return DBColumns.ERROR_USER_NOT_FOUND;
    }

    db.execSQL(
        "DELETE FROM "
            + DBColumns.FRIEND_STATE_TABLE_NAME
            + " WHERE "
            + DBColumns.FRIEND_STATE_USER_ACCOUNT
            + "=?",
        new Object[] {user.getAccount()});

    return DBColumns.RESULT_OK;
  }
  @Override
  public DBFriendGroupMapping find(String userAccount, String contactAccount) {
    db = getTransactionDB();

    // 要查询的用户
    DBUser user = userDao.findByAccount(contactAccount);

    // select fs.* from friend_state fs,friend_group fg where
    // fs.[user_account]='100002' and fs.[friend_group_account]=fg.[account]
    // and fg.[user_account]='100000'
    Cursor cursor =
        db.rawQuery(
            "SELECT fs.* FROM "
                + DBColumns.FRIEND_STATE_TABLE_NAME
                + " fs,"
                + DBColumns.FRIEND_GROUP_TABLE_NAME
                + " fg WHERE fs."
                + DBColumns.FRIEND_STATE_USER_ACCOUNT
                + "=? AND fs."
                + DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT
                + "=fg."
                + DBColumns.FRIEND_GROUP_ACCOUNT
                + " AND fg."
                + DBColumns.FRIEND_GROUP_USER_ACCOUNT
                + "=?",
            new String[] {contactAccount, userAccount});

    DBFriendGroupMapping mapping = null;
    if (cursor.moveToFirst()) {
      String friendGroupAccount =
          cursor.getString(cursor.getColumnIndex(DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT));
      DBFriendGroup friendGroup = fgDao.findByAccount(friendGroupAccount);
      mapping = DBObjectHelper.getDB3FriendGroupMapping(user, friendGroup, cursor);
    }
    cursor.close();

    return mapping;
  }
  @Override
  public List<DBFriendGroupMapping> findMappingByFriendGroup(DBFriendGroup friendGroup) {
    // friendgroup中分组中包含的user,及user状态
    db = getTransactionDB();
    Cursor cursor =
        db.rawQuery(
            "SELECT * FROM "
                + DBColumns.FRIEND_STATE_TABLE_NAME
                + " WHERE "
                + DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT
                + "=?",
            new String[] {friendGroup.getAccount()});
    List<DBFriendGroupMapping> mappings = new ArrayList<DBFriendGroupMapping>();
    while (cursor.moveToNext()) {
      String userAccount =
          cursor.getString(cursor.getColumnIndex(DBColumns.FRIEND_STATE_USER_ACCOUNT));
      DBUser user = userDao.findByAccount(userAccount);
      mappings.add(DBObjectHelper.getDB3FriendGroupMapping(user, friendGroup, cursor));
    }
    cursor.close();

    return mappings;
  }
  @Override
  public String getRemark(String userAccount, String contactAccount) {
    db = getTransactionDB();

    // select fs.[remark] from friend_state fs,friend_group fg where
    // fs.user_account='100009' and fg.[user_account]='100000' and
    // fs.[friend_group_account] = fg.[account];
    Cursor cursor =
        db.rawQuery(
            "SELECT fs."
                + DBColumns.FRIEND_STATE_REMARK
                + " FROM "
                + DBColumns.FRIEND_STATE_TABLE_NAME
                + " fs,"
                + DBColumns.FRIEND_GROUP_TABLE_NAME
                + " fg WHERE fs."
                + DBColumns.FRIEND_STATE_USER_ACCOUNT
                + "=? AND fg."
                + DBColumns.FRIEND_GROUP_USER_ACCOUNT
                + "=? AND fs."
                + DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT
                + "=fg."
                + DBColumns.FRIEND_GROUP_ACCOUNT,
            new String[] {contactAccount, userAccount});
    String remark = null;
    if (cursor.moveToFirst()) {
      remark = cursor.getString(0);
    }
    cursor.close();

    if (remark == null) {
      remark = userDao.findByAccount(contactAccount).getNickname();
    }

    return remark;
  }
  @Override
  public void updateXMPPFriendState(String userAccount, String jid, int status) {
    // public void updateXMPPFriendState(String jid, int status) {
    Logger.d("db", "user:" + userAccount + ",jid:" + jid + ",status:" + status);
    // 更新对应状态
    db = getTransactionDB();

    // 根据jid查询user_account
    // String userAccount = userDao.findByName(jid).getAccount();
    DBUser contact = userDao.findByName(jid);
    if (contact == null) {
      // 抛出异常,暂时不做
      return;
    }

    String contactAccount = contact.getAccount();
    // update friend_state set login_state=5 where user_account='100120' and
    // exists(select * from friend_group where account='33' and user_account='100118');
    // group_account不好获取
    //		db.execSQL("UPDATE " +DBColumns.FRIEND_STATE_TABLE_NAME
    //				+ " SET " + DBColumns.FRIEND_STATE_LOGIN_STATE + "=? WHERE "
    //				+ DBColumns.FRIEND_STATE_USER_ACCOUNT + "=? AND EXISTS(SELECT * FROM "
    //				+ DBColumns.FRIEND_GROUP_TABLE_NAME + " WHERE "
    //				+ DBColumns.FRIEND_GROUP_ACCOUNT + "=? AND "
    //				+ DBColumns.FRIEND_GROUP_USER_ACCOUNT + "=?)"
    //				,new Object[]{status,contactAccount});

    // 查询对应的friend_state_account,然后修改
    // select fs.account
    // from friend_state fs,friend_group fg
    // where fs.[user_account]='100120'
    // and fs.[friend_group_account]=fg.[account]
    // and fg.[user_account]='100112'
    Cursor cursor =
        db.rawQuery(
            "SELECT fs."
                + DBColumns.FRIEND_STATE_ACCOUNT
                + " FROM "
                + DBColumns.FRIEND_STATE_TABLE_NAME
                + " fs,"
                + DBColumns.FRIEND_GROUP_TABLE_NAME
                + " fg WHERE fs."
                + DBColumns.FRIEND_STATE_USER_ACCOUNT
                + "=? AND fs."
                + DBColumns.FRIEND_STATE_FRIEND_GROUP_ACCOUNT
                + "=fg."
                + DBColumns.FRIEND_GROUP_ACCOUNT
                + " AND fg."
                + DBColumns.FRIEND_GROUP_USER_ACCOUNT
                + "=?",
            new String[] {contactAccount, userAccount});
    String account = null;
    if (cursor.moveToFirst()) {
      account = cursor.getString(0);
    }
    cursor.close();

    if (account == null) {
      // 不存在,抛出异常,暂不处理
      return;
    }

    // 修改状态
    db.execSQL(
        "UPDATE "
            + DBColumns.FRIEND_STATE_TABLE_NAME
            + " SET "
            + DBColumns.FRIEND_STATE_LOGIN_STATE
            + "=? WHERE "
            + DBColumns.FRIEND_STATE_ACCOUNT
            + "=?",
        new Object[] {status, account});
  }
 @Override
 public void close() {
   super.close();
   userDao.close();
   fgDao.close();
 }