2012-01-09 31 views
18

Tôi đang cố chèn và cập nhật một mẩu thông tin trên một số liên lạc hiện có do đó tôi đã tạo một ứng dụng mẫu để phát triển chức năng. Tất cả những gì tôi muốn ứng dụng mẫu của tôi làm là chèn (hoặc nếu có) cập nhật địa chỉ email trên một số liên lạc.Sửa đổi thông tin liên lạc

Tôi chọn một số liên lạc thông qua tiếp cận mục đích hệ thống như vậy:

startActivityForResult(new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI), PICK_CONTACT_REQUEST); 

URI mà được trả về là của Contact mà đã được lựa chọn và đi kèm theo hình thức này (RawContact?): content://com.android.contacts/contacts/lookup/0r2-2A90214945/2.

tôi có thể kéo lại tất cả các mục Data (RawContact?) Về vấn đề này bằng cách thực hiện đoạn mã sau:

Cursor cursor = contentResolver.query(mContactUri, null, null, null, null); 
try { 
    if (cursor.moveToFirst()) { 
     for(int i=0; i < cursor.getColumnCount(); i++) { 
      String message = cursor.getColumnName(i); 
      Log.v("", message); 
     } 
    } 
} finally { 
    cursor.close(); 
} 

Từ này tôi sẽ có thể xác định nếu tiếp xúc đã có một thành viên CommonDataTypes.EmailData:

cursor.getColumnIndex(CommonDataKinds.Email.CONTENT_ITEM_TYPE) != -1; 

Và sau đó thực hiện một trong các cách sau để một trong hai Insert hoặc Update các Data:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

ops.add(ContentProviderOperation.newInsert(mContactUri) 
    .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) 
    .withValue(Email.DISPLAY_NAME, "[email protected]") 
    .withValue(Email.TYPE, Email.TYPE_HOME) 
    .build()); 
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 

Nhưng điều này mang lại cho tôi một ngoại lệ: java.lang.UnsupportedOperationException: URI: content://com.android.contacts/contacts/lookup/0r2-2A90314945/2, calling user:

Hy vọng rằng ai đó có thể nhìn thấy những gì tôi đã bỏ qua.

PS, Tôi đang sử dụng các điều khoản:

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

ok, tôi sẽ xóa nó. cảm ơn –

Trả lời

43

Dân Android cần phải cập nhật documentation của họ. Nó thực sự phục vụ để làm cho tôi biết ít hơn về những gì đã xảy ra hơn tôi đã có thể nhận được từ đoán. Nó cho thấy rằng bạn có thể kéo trở lại một Contact, sẽ chứa nhiều RawContacts sẽ chứa Data.

Cách diễn giải đó hoàn toàn sai. ContactContracts dữ liệu là thay vì ba bình thường trung bình bảng cơ sở dữ liệu hàng ngày *:

ContactContract Bàn

Bảng: Contacts

Tiếp cận URI: Contacts.CONTENT_URI

Primary Key **: Data._ID

Mô tả:

Bảng này chứa thông tin về một liên hệ (khi được thêm vào, biểu tượng người dùng của nó là gì, nó có nhạc chuông tùy chỉnh) không.

Mối quan hệ: Mối quan hệ 1-với-nhiều với bảng RawContact.

Bảng: RawContacts

Tiếp cận URI: RawContacts.CONTENT_URI

Primary Key: Data._ID

Ngoại chính **: Data.CONTACT_ID

Mô tả:

Bảng này chứa thông tin về một tập hợp các mục dữ liệu có liên quan. Một RawContact có thể chứa Loại Email, Tên Hiển thị Email, Số Điện thoại, Tên Hiển thị Điện thoại, vv Một RawContact có thể được tổng hợp với RawContacts khác để tạo một Contact khi người dùng nhìn thấy nó. Liên hệ chỉ có thể chứa một RawContact.

Mối quan hệ: Mối quan hệ 1-với-nhiều với bảng Data.

Bảng: Data

Tiếp cận URI: Data.CONTENT_URI

Primary Key: Data._ID

Ngoại chính: Data.RAW_CONTACT_ID

Mô tả:

Bảng này chứa một trường thông tin duy nhất. Địa chỉ email, Số điện thoại, Loại số điện thoại (nhà riêng/cơ quan), Biệt hiệu, Tên hiển thị.

Trong câu trả lời cho câu hỏi

Tôi đã tải lên toàn bộ dự án mẫu để GitHub để cho phép những người khác để xem làm thế nào để truy vấn, cập nhật và chèn các bản ghi sử dụng ContactContract.

Bạn có thể tìm thấy những dự án để tải về tại đây: https://github.com/gwoodhouse/ContactContractSample

Nếu bạn chỉ muốn nhìn vào mã java thực hiện truy vấn/cập nhật/chèn ở đây là các tập tin lớp: https://github.com/gwoodhouse/ContactContractSample/blob/master/ContactsIntegration/src/com/woodhouse/example/activity/ContactsIntegrationActivity.java

Hy vọng điều này giúp!

* Không phải là một bảng, nhưng một ContentProvider

** không Nghiêm đúng.

+0

Trích dẫn tuyên bố của bạn: "Liên hệ có thể chứa chỉ một RawContact" ... Tôi nghĩ một liên hệ là sự kết hợp của nhiều RawContacts. Đúng nếu tôi đã sai lầm. –

+0

(Đã lâu rồi) Tôi nghĩ một 'Liên hệ' có thể chứa duy nhất' RawContact' và vẫn hợp lệ. – Graeme

+1

Có, nhưng nó vẫn sẽ hợp lệ nếu nó chứa nhiều RawContacts. Cảm ơn dự án. –

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