天天看點

完美解決android監聽聯系人資料變化

先說說原理,大家知道,android可以對資料庫進行監控。但是個人感覺這個監控不給力,無論怎麼實作監控,最後傳回的結果是資料庫是否改變,沒有告訴我們資料庫的那條資料進行了改變或者是删除,添加,并不能解決大多數需求。當初我遇到這樣的問題我也很痛苦,無論怎麼早資料都沒找到自己想要的,而網上大多數資料隻是告訴你怎麼監控資料庫,但沒有告訴你怎麼擷取具體的資料改變。往往成功是逆境裡逼出來的,我去查找英文API,發現ContactsContract.RawContacts類中VERSION字段的說明,原文如下:Version number that is updated whenever this row or its related data changes. This field can be used for optimistic locking of a raw contact.中文大概意思就是,隻要是聯系人相關屬性隻要進行修改了都會自加。有了這個說明,我自己對android虛拟機上的聯系人進行測試,然後把sqlit資料庫導出進行檢視,發現VERSION确實發生了改變。有了這個依據,便能很好的解決監聽聯系人資料變化了。

     我的設計思路是這樣,當使用者第一次啟動程式,程式就周遊RawContacts,将所有_id和VERSION組合成字元串,然後用SharedPreferences存入。這樣再監聽資料庫,當資料庫有改變時,資料進行對比,就知道哪些資料進行了修改,如果SharedPreferences資料不存在說明有增加,如果SharedPreferences資料大于原有資料庫的資料說明有增加。

首先我先放上一段JAVA的demo展現思路。android代碼稍後放上,如有疑問或者有什麼不對,請大家指教。

public class ContactJianTing

{

public static void main(String args[])

init();

String str = "1-2";

String a[] =str.split("-");

for (String string : a)

System.out.println(string);

}

private static void init()

HashMap<String, String> a = new HashMap<String, String>();

HashMap<String, String> b = new HashMap<String, String>();

for (int key = 1; key <= 1000; key++)

a.put(String.valueOf(key), String.valueOf(key));

b.put(String.valueOf(key), String.valueOf(key+1));

Set<String> aSet = a.keySet();

for (String string : aSet)

long start = System.currentTimeMillis();

for(int i = 1;i<=1000;i++)

System.out.println("号碼 "+i);

if(!a.get(String.valueOf(i)).equals(b.get(String.valueOf(i))))

System.out.println("資料不同");

System.out.println("-----------");

long end = System.currentTimeMillis();

long sum = end - start;

System.out.println("總共耗時"+sum);

在沒有連接配接資料庫的情況下,使用HashMap,1000條資料耗時40毫秒左右。對于使用者而言,擁有1000個聯系人的手機畢竟少之又少。

     本文轉自xyz_lmn51CTO部落格,原文連結:http://blog.51cto.com/xyzlmn/1230804,如需轉載請自行聯系原作者