5

Ich bin erfolgreich speichern Kontakte in parse.com Dashboard Datenbrowser mit diesem Code.Was ist der beste Weg, um eindeutige Kontakte in Android zu bekommen

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(); 
      } 
     } 
    } 
    } 

Aber es gibt keine Prüfung für die doppelten Kontakte!

Es speichert alle Kontakte doppelt aus Sim/Telefonspeicher.

Wie kann es vermieden werden?

Eine mögliche Methode, die ich denke, ist verschiedene Namen zu speichern (Kontakt) in der lokalen Datenbank, & dann das Abrufen von Daten, dass es zu speichern, in parse.com

Gibt es einen besseren Weg gibt?

Vielen Dank im Voraus ...

+0

Was ist das Problem hier? Erhalten Sie doppelte Einträge? –

+0

Ja, ich erhalte doppelte Einträge wie in meinem Telefon –

Antwort

1

Set ist eine Sammlung in Java, die Duplikate nicht zulässt. Sie können Ihre Daten in ein Set mit der Nummer als Schlüssel und Namen als Wert eingeben, um doppelte Nummern zu vermeiden.

Und später können Sie sie vom Set zurücknehmen und in Ihr testObject mit Namen als Schlüssel und Nummer als Wert eingeben.

+0

Kannst du bitte mehr erklären, wie du es machen kannst? –

3

Bitte beachten Sie die folgende Methode. Sie erhalten eine Kontaktliste, die keine doppelten Telefonnummern enthält.

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(); 
       } 
      } 
     } 
    } 
+0

Danke für die Antwort! Aber das selbe Problem existiert, und warum benutzt du 'if (! List.contains (phone)) { contacts.add (testObject); } list.add (Telefon); 'nach testObject.Put (* –

0

Hier ist die Lösung, die ich für Sie ausgearbeitet .... Sie können nach Informationen der logcat durchlaufen, wie es funktioniert 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) { 

     } 
    } 
} 

Permission

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

Ihre Ausgabe ist auf now_deletedrepeated_contact_from_total() Methode.

prüfen totalcontact Array-Wert für die endgültige Ausgabe

+0

Hmm, danke, es funktioniert, könnte aber besser sein, wenn es auch Namen hatte, in anderen Arraylist –

5

Ein einfacher Ansatz sein könnte, um die Daten zu einem MatrixCursor ohne doppelte Daten zu laden. Nehmen wir zum Beispiel an, Sie hätten einen Cursor c1 mit vielen Kontakten, aber Sie benötigen einen Cursor ohne doppelte Daten. Hier ist, was Sie tun können:

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(); 

Machen Sie eine Instanz von MatrixCursor mit gleichen Spalten, und dann laden, wenn letzte Nummer oder Kontaktnamen nicht, dass der vorherigen Kontakt entsprechen. Die Bedingung für die Überprüfung liegt bei Ihnen. Fragen Sie die Daten in einer bestimmten Reihenfolge ab, sodass die doppelten Kontakte zuerst zusammenbleiben.

Sobald der MatrixCursor geladen ist, können Sie Daten von ihm abrufen. Sie können es auch über einen benutzerdefinierten CursorLoader oder CursorAdapter an eine Ansicht anhängen.

+1

Dies funktionierte perfekt, vielen Dank! –

+0

Froh, dass es für Sie gearbeitet hat! – ZakiMak