在Android中获取不同联系人的最佳方式是什么?

Viv*_*rde 6 database android database-design android-contacts parse-platform

我通过此代码成功地在parse.com仪表板数据浏览器中存储联系人.

public void readContacts(){
         ContentResolver cr = getContentResolver();
         Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);

         if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) ==1) {
                    System.out.println(name );
                    ParseObject testObject = new ParseObject("Contacts");

                    testObject.put("names", name);

                    // get the phone number
                    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                                           ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                                           new String[]{id}, null);
                    while (pCur.moveToNext()) {
                          String phone = pCur.getString(
                                 pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                         System.out.println( phone);
                        testObject.put("phonenumber", phone);

                    }
                    pCur.close();
                    testObject.saveInBackground();
           }
        }
     }
  }
Run Code Online (Sandbox Code Playgroud)

但是没有检查重复的联系人!

它存储从SIM /手机内存复制的所有联系人.

怎么可以避免?

我认为一种可能的方法是在本地数据库中存储不同的名称(联系人),然后检索该数据以将其存储在parse.com中

有没有更好的方法?

提前致谢...

Zak*_*Mak 6

一种简单的方法是将数据加载到MatrixCursor而不会出现重复数据.例如,假设您有一个光标c1将有许多联系人,但您需要一个没有重复数据的游标.这是你可以做的:

MatrixCursor mc = new MatrixCursor(new String[] { 
                        Phone._ID, 
                        Phone.DISPLAY_NAME_PRIMARY,
                        Phone.NUMBER
});

String lastNumber = "";

while(c1.moveToNext()){
    String id = c1.getString(c1.getColumnIndexOrThrow(Phone._ID));
    String name = c1.getString(c1.getColumnIndexOrThrow(Phone.DISPLAY_NAME_PRIMARY)));
    String number = c1.getString(c1.getColumnIndexOrThrow(Phone.NUMBER));

    //Some condition to check previous data is not matched and only then add row
    if(!lastNumber.contains(number)){
            lastNumber = number;
            mc.addRow(new String[]{id, name, number});
    }


}

c1.close();
Run Code Online (Sandbox Code Playgroud)

创建具有相同列的MatrixCursor实例,然后在最后一个数字或联系人姓名与上一个联系人的名称不匹配时加载.检查的条件由您决定.按某种顺序查询数据,以便重复的联系人首先保持在一起.

加载MatrixCursor后,您可以从中获取数据.您还可以通过自定义CursorLoader或CursorAdapter将其附加到视图.


小智 1

Set是java中的集合,不允许重复。您可以将数据放入一个以数字为键、名称为值的集合中,以避免重复的数字。

稍后您可以将它们从集合中取出并放入您的 testObject 中,以名称作为键,数字作为值。