在Parse中查找用户的哪些电话联系人

时间:2015-08-25 03:03:49

标签: android parse-platform

在我的应用程序中,每个用户都使用电话号码登录。换句话说,每个用户名对应不同的号码。我想在某种程度上检测哪些手机通讯录正在使用此应用程序。但是,我无法确定我该怎么做。首先,我考虑查询每个联系人,并在最后使用OR查询获取users_in_contacts。这个方法在this answer

中给出
public void getFriends(List<String> numbers) {
    List<ParseQuery<ParseUser>> queries = new ArrayList<ParseQuery<ParseUser>>();
    for (String number : numbers) {
        ParseQuery<ParseUser> parseQuery = ParseUser.getQuery();
        parseQuery.whereEqualTo("username", number);
        queries.add(parseQuery);
    }

    ParseQuery<ParseUser> userQuery = ParseQuery.or(queries);

    userQuery.findInBackground(new FindCallback<ParseUser>() {

        @Override
        public void done(List<ParseUser> numberList, ParseException e) {
            if (e == null) {
                for (int i = 0; i < numberList.size(); i++) {
                    Log.v("" + i + ". user_contact", numberList.get(i).getUsername());
                }
            }
        }
    });
}

这是一个有效的解决方案,但我不想破解太多查询并超过每秒请求的限制。因此,我想知道是否有更好的选择。

简而言之,我怎样才能实现尽可能快速且无成本地(相对于每秒请求数)查找联系人中的用户?我会全神贯注于你的每一个建议和替代方法。提前谢谢。

1 个答案:

答案 0 :(得分:1)

在Parse中有一个名为.whereContainedIn()的查询方法。通过使用此查询,我可以在不使用任何其他查询的情况下获取已在合同中的用户。我将所有合同(与电话号码相关联)作为此方法中的参数并且有效。我编写了一个AsyncTask来执行这些操作并在ListView中监视结果。如果你提出任何建议来提高这项任务的表现,我将不胜感激。

public class RetrieveContactedUsersTask extends AsyncTask<String, Void, String> {

    private Activity activity;
    HashMap<String, String> contactsMap = new HashMap<>();
    String[] contactedUserNumbers;
    ListView contactsView;


    public RetrieveContactedUsersTask (Activity activity, ListView contactsView) {

        this.activity = activity;
        this.contactsView = contactsView;
    }

    @Override
    protected String doInBackground(String... params) {

        retrieveContactList();
        return "Executed";
    }

    @Override
    protected void onPostExecute(String result) {

        TreeMap<String, String> contactedUsersMap = new TreeMap<>();

        for (int i = 0; i < contactedUserNumbers.length; i++) {
            contactedUsersMap.put(contactsMap.get(contactedUserNumbers[i]), contactedUserNumbers[i]);
        }

        contactsView.setAdapter(new ContactAdapter(activity, contactedUsersMap));
    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... values) {}

    public void retrieveContactList() {

        Cursor phones = null;

        try {
            phones = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            while (phones.moveToNext())
            {
                String _number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll("\\s+", "");
                String _name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                contactsMap.put(_number, _name);
            }
            phones.close();

        } catch ( Exception e ) {}

        finally {
            if(phones != null){
                phones.close();
            }
        }

        try {
            retrieveContactedUsers(contactsMap);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public void retrieveContactedUsers(Map<String, String> numbers) throws ParseException {
        ParseQuery<ParseUser> query = ParseUser.getQuery();
        query.whereContainedIn("username", numbers.keySet());

        List<ParseUser> users= query.find();
        contactedUserNumbers = new String[users.size()];
        for (int i = 0; i < users.size(); i++) {
            String value = users.get(i).getUsername();
            contactedUserNumbers[i] = value;
        }
    }
}