2015-05-29 47 views
5

Tôi đang phải đối mặt với vấn đề này sqlite trong đó tôi đang cố gắng để trích xuất các địa chỉ liên lạc có số điện thoại/s với các truy vấn sau đây:sqlite danh bạ chiết xuất Android với số điện thoại

Cursor cursor = context.getContentResolver(). 
    query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ 
       ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
       ContactsContract.CommonDataKinds.Phone.NUMBER, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts.PHOTO_URI 
      }, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?", 
      new String [] {"0"}, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC" 
    ); 

Vấn đề là ở trường hợp người liên hệ có nhiều hơn 1 số điện thoại, kết quả sẽ có dạng này:

id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000 
id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0800 000 000 
id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0900 000 000 

không mong muốn vì dữ liệu trùng lặp.

tôi chỉ muốn thực hiện 1 truy vấn đến db mà hy vọng có thể được viết để trả lại kết quả như thế này:

id: 451, name: Maria, photoUri: null, has_phone_number: 1, phone_number: 0700 000 000, 0800 000 000, 0900 000 000 

Có thể?

Cảm ơn bạn.

+0

tôi không nghĩ rằng nó có thể là cách db android được thiết lập. là nó ra khỏi câu hỏi để đưa điều này vào một danh sách và hợp nhất chúng bằng tay với một vòng lặp hoặc một cái gì đó? tôi biết rằng prob không phải là một cách tốt nhưng tôi không thể nghĩ ra một cái tốt hơn. –

+0

Nó cần phải làm việc với các địa chỉ liên lạc trong phạm vi hàng ngàn, tôi muốn tránh việc xử lý thêm. –

+0

Tôi không biết android, nhưng điều này không quá khó để thực hiện trong SQL. Bạn có thể chạy các truy vấn SQL thô đối với cơ sở dữ liệu của mình hay không hoặc bạn có bị hạn chế sử dụng chức năng truy vấn đó không? –

Trả lời

0

Tôi không nghĩ rằng có thể những gì bạn muốn làm, Đây là một giải pháp thay thế bằng cách sử dụng HashMap. Nó có thể xử lý hàng ngàn mục, vì vậy đừng lo lắng.

Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
      new String[]{ ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
        ContactsContract.CommonDataKinds.Phone.NUMBER, 
        ContactsContract.Contacts.DISPLAY_NAME, 
        ContactsContract.Contacts.PHOTO_URI }, 
      ContactsContract.Contacts.HAS_PHONE_NUMBER + ">?", 
      new String [] {"0"}, 
      ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 

    Map<String, List<String>> phonesPerContact = new HashMap<>(); 
    if (cursor.moveToFirst()) { 
     do { 
      String name = cursor.getString(2); 
      String phone = cursor.getString(1); 

      if (!phonesPerContact.containsKey(name)){ 
       phonesPerContact.put(name, new ArrayList<String>()); 
      } 

      phonesPerContact.get(name).add(phone); 
     } while (cursor.moveToNext()); 
    } 

    for (String name: phonesPerContact.keySet()){ 
     //Do whatever you want with the contact and its list of phones 

     List<String> phones = phonesPerContact.get(name); 
     Log.i("test", "Name: " + name + ", Numbers: " + phones.toString()); 
    } 
+0

Một bình luận về downvote wil được đánh giá cao. – omainegra

+0

Thx vì đã đâm vào nó (+1), tôi sẽ phải xem những gì thực hiện tôi sẽ chọn cuối cùng. –

Các vấn đề liên quan