先說說原理,大家知道,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,如需轉載請自行聯系原作者