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

时间:2014-09-12 05:44:32

标签: android database database-design parse-platform android-contacts

我通过此代码在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();
           }
        }
     }
  }

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

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

如何避免?

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

有没有更好的方法?

提前致谢...

4 个答案:

答案 0 :(得分: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();

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

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

答案 1 :(得分:3)

请参阅以下方法。您将获得没有重复电话号码的联系人列表。

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

        ArrayList<ParseObject> contacts = new ArrayList<ParseObject>();
        ArrayList<String> list = new ArrayList<String>();
        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);
                        if(!list.contains(phone)) {
                            contacts.add(testObject);
                        }

                        list.add(phone);

                    }

                    pCur.close();
                    testObject.saveInBackground();
                }
            }
        }
    }

答案 2 :(得分:1)

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

稍后你可以从set中取回它们并放入你的testObject,其名称为key,number为value。

答案 3 :(得分:0)

这是我为你解决的解决方案.... 您可以通过logcat获取有关它如何100%工作的信息

import java.util.ArrayList;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;

public class MainActivity extends Activity {
    String ClsSimPhonename = null;
    String ClsSimphoneNo = null;

    public static ArrayList<String> phonecontact = new ArrayList<String>();
    public static ArrayList<String> simcontact = new ArrayList<String>();
    public static ArrayList<String> totalcontact = new ArrayList<String>();
    public static ArrayList<String> repeatedcontact = new ArrayList<String>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // get phone contact...
        getphonecontact();
        // get sim contact...
        getsimcard_contact();

        System.out.println("phone??? " + phonecontact);
        System.out.println("sim??? " + simcontact);

        System.out.println("sim_size??? " + simcontact.size());
        System.out.println("phone_size??? " + phonecontact.size());
        System.out.println("totalcontact_size??? " + totalcontact.size());

        // filter process beigins here....
        nowFilterContact();

    }

    private void nowFilterContact() {
        // TODO Auto-generated method stub

        // determine which contact have more item....

        if (simcontact.size() > phonecontact.size()) {

            onemorefiltermethod(simcontact.size(), simcontact, phonecontact);

        } else {
            onemorefiltermethod(phonecontact.size(), phonecontact, simcontact);
        }

    }

    private void onemorefiltermethod(int size, ArrayList<String> contacts,
            ArrayList<String> contact2) {
        // TODO Auto-generated method stub

        // compare both contact and get repeated contacts....
        for (int i = 0; i < size; i++) {

            try {
                if (contacts.contains(contact2.get(i))) {

                    // add repeated contacts to array....
                    repeatedcontact.add(contact2.get(i));
                }
            } catch (Exception e) {

            }

        }

        System.out.println("repeatedcontact_size??? " + repeatedcontact.size());
        // now delete repeated contact from total contact
        now_deletedrepeated_contact_from_total();
    }

    private void now_deletedrepeated_contact_from_total() {
        // TODO Auto-generated method stub

        for (int i = 0; i < totalcontact.size(); i++) {

            try {
                if (totalcontact.contains(repeatedcontact.get(i))) {
                    totalcontact.remove(repeatedcontact.get(i));

                }
            } catch (Exception e) {

            }

        }
        System.out.println("Final contact size" + totalcontact.size());

        System.out.println("Final contact " + totalcontact);

    }

    private void getsimcard_contact() {
        // TODO Auto-generated method stub
        try {
            Uri simUri = Uri.parse("content://icc/adn");
            Cursor cursorSim = this.getContentResolver().query(simUri, null,
                    null, null, null);

            while (cursorSim.moveToNext()) {
                ClsSimPhonename = cursorSim.getString(cursorSim
                        .getColumnIndex("name"));
                ClsSimphoneNo = cursorSim.getString(cursorSim
                        .getColumnIndex("number"));
                ClsSimphoneNo.replaceAll("\\D", "");
                ClsSimphoneNo.replaceAll("&", "");
                ClsSimPhonename = ClsSimPhonename.replace("|", "");

                /*
                 * add contact from phone to array phone array and total array
                 */

                phonecontact.add(ClsSimphoneNo);
                totalcontact.add(ClsSimphoneNo);

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void getphonecontact() {
        // TODO Auto-generated method stub
        try {
            String[] PROJECTION = new String[] { Contacts._ID,
                    Contacts.DISPLAY_NAME, Phone.NUMBER };

            Cursor c = managedQuery(Phone.CONTENT_URI, PROJECTION, null, null,
                    null);
            if (c.moveToFirst()) {
                String ClsPhonename = null;
                String ClsphoneNo = null;

                do {
                    ClsPhonename = c.getString(c
                            .getColumnIndex(Contacts.DISPLAY_NAME));
                    ClsphoneNo = c.getString(c.getColumnIndex(Phone.NUMBER));
                    /*
                     * add contact from sim to array sim array and total array
                     */
                    simcontact.add(ClsphoneNo);
                    totalcontact.add(ClsphoneNo);

                    ClsphoneNo.replaceAll("\\D", "");
                    ClsPhonename = ClsPhonename.replaceAll("&", "");
                    ClsPhonename.replace("|", "");
                    String ClsPhoneName = ClsPhonename.replace("|", "");

                } while (c.moveToNext());
            }
        } catch (Exception e) {

        }
    }
}

权限

 <uses-permission android:name="android.permission.READ_CONTACTS"/>

您的输出采用now_deletedrepeated_contact_from_total()方法。

检查最终输出的totalcontact数组值