如何寫一個電話簿(Phone book) (新增/修改/刪除/查詢) 之二

還記得如何寫一個電話簿(Phone book) (ContentResolver)嗎?
其實還少很多功能, 例如新增/修改/刪除/查詢, 以及傳送簡訊
而當中還欠缺畫面即時更新, 我們還有很多可以做呢:)









上次只用到Call的功能, 因此這次加入了三個功能


由於新增了很多方法, 因此我將許多方法包成一個類別HandlePhoneBook
裡面有Query, Insert 以及 Delete三個方法, Update方法目前我還沒研究出來怎麼寫:P
暫時先放著>"<
另外在加上一個額外的小功能: 傳簡訊
請參考如何使用SmsManager傳簡訊


Query
public void query(){
    contactsArrayList.clear();
    contacts_name = mContentResolver.query(
        ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
 
    while (contacts_name.moveToNext()) {
        contactsMap = new HashMap<String, String>();
 
        long id = contacts_name.getLong(contacts_name
            .getColumnIndex(ContactsContract.Contacts._ID));
        contacts_number = mContentResolver.query(
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
            null,
            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
            + Long.toString(id), null, null);
 
        String phoneNumber = "";
        while(contacts_number.moveToNext()){
            phoneNumber = contacts_number
                .getString(contacts_number
                .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }
        contacts_number.close();
 
        String name = contacts_name
            .getString(contacts_name.getColumnIndex(
                ContactsContract.Contacts.DISPLAY_NAME));
        contactsMap.put(NAME, name);
        contactsMap.put(NUMBER, phoneNumber);
        contactsArrayList.add(contactsMap);
    }
}
這個方法是之前getPhoneBookData搬過來的, 
目的就是讓搜尋出來的電話號碼跟名字都存在contactsArrayList這個容器裡面,
這樣一來, 我們就可以利用這個類別的物件, 隨時對畫面作即時更新。



    public void insert(String name, String number){
        ContentValues values = new ContentValues();  
          
        Uri rawContactUri = mContentResolver.insert(RawContacts.CONTENT_URI, values);  
        long rawContactId = ContentUris.parseId(rawContactUri);  
          
        values.clear();  
        values.put(Data.RAW_CONTACT_ID, rawContactId);  
        values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); 
        values.put(StructuredName.GIVEN_NAME, name);  
        mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);  
          
        values.clear();  
        values.put(Data.RAW_CONTACT_ID, rawContactId);  
        values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);  
        values.put(Phone.NUMBER, number);  
        values.put(Phone.TYPE, Phone.TYPE_MOBILE);  
        mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);  
    }
這個方法, 會讓使用者輸入名字跟電話號碼, 就可以把資料寫入系統電話簿,
然後我們就對contactArrayList做增加的動作, 再來對adapter作更新的動作,
就可以讓畫面馬上多一筆資料。


系統電話簿


public void delete(String name) {    
    Cursor c = mContentResolver.query(
        ContactsContract.Contacts.CONTENT_URI, 
            null,
            ContactsContract.Contacts.DISPLAY_NAME+"="+"'"+name+"'",
            null,
            null);
    c.moveToFirst();
    String id = c.getString((c.getColumnIndex("_id")));
    ArrayList<ContentProviderOperation> ops =
        new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation
        .newDelete(ContactsContract.RawContacts.CONTENT_URI)
        .withSelection(Data.CONTACT_ID + "=?", new String[]{id})
        .build());
    try {
       mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
    } 
    catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    catch (OperationApplicationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
        
}
這個刪除的方法, 先搜尋要刪除的資料的id,
接著再用這個id去找出資料庫的這筆資料, 將它刪除。

最主要的就是這三個方法。

程式碼
http://uploadingit.com/file/ngqww8dedfs3gvf2/ProviderContactDemo2.zip