<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    使用ContentResolver無法進行distinct查詢的解決方法

    發布時間:2013-9-23 18:07    發布者:reggae
    關鍵詞: android
    場景假定:一個聯系人A有兩個電話號碼,分別是32111268和32111269,F在要對聯系人的電話進行查詢,以得到聯系人的raw_contact_id。
    (PS:^_^不錯的Android開發交流群314230976,驗證:eec,有興趣的話可以加入進來一起討論)
    我們知道,在Android系統中,所有和聯系人有關的數據,都存儲在數據庫 /data/data/com.android.providers.contacts/databases/contacts2.db里面的data數 據表中,因此,可以對該表進行查詢以獲得聯系人的raw_contact_id。對于上面假定的情況,在data數據表中和聯系人A有關的電話記錄有兩 條,大致如下:
    … |A’s raw_contact_id| … … |32111268|… …
    … |A’s raw_contact_id| … … |32111269|… …
    很顯然,這兩個電話號碼屬于同一個聯系人,F在假定我們要查詢電話號碼中包含“32111”的聯系人,在sqlite命令行下可以這么寫(假定按raw_contact_id排序):
    1 SELECT DISTINCT raw_contact_id FROMdata WHERE mimetype_id = 5 ANDdata1 LIKE ‘2111%’ ORDER BY raw_contact_id;
    這樣就會得到唯一的
    A’s raw_contact_id
    但是如果寫成:
    1 SELECT raw_contact_id FROM data WHEREmimetype_id = 5 AND data1 LIKE‘2111%’ ORDER BY raw_contact_id;
    得到的結果就是:
    A’s raw_contact_id
    A’s raw_contact_id
    這顯然不符合要求,因為對于同一個聯系人的raw_contact_id,我們不希望在查詢結果中出現兩次。這就是為什么在前面一條sql語句中加上DISTINCT的原因。
    在我們自己的Android應用中,要對contacts2.db進行訪問進行訪問, 只能通過ContentResolver對象,這是因為contacts2.db不屬于我們自己的Android應用進程,因此,無法得到和 contacts2.db相關的SQLiteDatabase對象,進而無法調用SQLiteDatabase中的execSQL方法去執行上面的SQL 語句。同時,我們在使用ContentResolver對象對data數據表進行查詢的時候,無法使用DISTINCT關鍵字!這就是說,如果一個聯系人 有兩個電話號碼符合查詢條件,那么該聯系人的raw_contact_id就會在返回的Cursor對象中出現兩次!下面的寫法
    01 ContentResolver resolver = context.getContentResolver();
    02
    03 Cursor cursor = resolver.query(Data.CONTENT_URI,
    04
    05 newString[]{Data.RAW_CONTACT_ID}, // 居然不支持distinct,如果在這里加上distinct將會出現錯誤!
    06
    07 Data.MIMETYPE + " = '"+ Phone.CONTENT_ITEM_TYPE + "' AND "+ Data.DATA1 + "LIKE '2111%' ",
    08
    09 null,
    10
    11 Data.RAW_CONTACT_ID);
    和前面的
    1 SELECT raw_contact_id FROM data WHEREmimetype_id = 5 AND data1 LIKE‘2111%’ ORDER BY raw_contact_id;
    所得到的結果是一樣的,會得到兩個一模一樣的A’ raw_contact_id,這顯然不符合要求。
    那么怎么辦呢?我們知道Java中Set具有“A collection that contains no duplicate elements”,也就是說Set中的元素是唯一的,當調用add方法,往Set對象加入對象時,如果被加的對象已經在Set中存在,那么該對象將不會 被再次加入,以保證該對象在Set中的唯一性。為此,在上面代碼的基礎上,可以考慮使用實現了Set接口的HashSet。
    1. 1 HashSet hashSet = newHashSet();
    2. 2 // 用這種方式(Set)來保證唯一性
    3. 3
    4. 4 while(cursor.moveToNext()){
    5. 5 hashSet.add(cursor.getInt(0));
    6. 6 }
    復制代碼
    這樣一來,在hashSet中的A’s raw_contact_id就只有一個了,也就是說通過這種方式,變通地實現了distinct這個sql關鍵字的語義。
    當然,這樣會增加額外的處理時間,在一個有1200條記錄,其中電話記錄有710條的 data數據表中,上面的操作耗時30ms左右(ThinkPad T410, Android 模擬器環境下),對于普通的和聯系人有關的應用而言,30ms的延遲算不了什么大事,因此這種變通的方式應該是可行的。
    個人感覺,Android系統自帶的聯系人數據庫及其ContentResolver 在很多時候都還算比較方面,但同樣在很多情況下,也存在很明顯的限制。對于喜歡自己寫SQL語句的朋友而言,這種限制幾乎是難以忍受的,比如無法通過 ContentResolver在contacts2.db中增加觸發器(在sqlite命令行下是可以的,但這樣對于要發布的和聯系人有關的引用而言, 這樣做是不合適的)等等。
    進而言之,SQLite這個數據庫短小精悍,包含的特點也算不少,總體說來相當不錯,否則也就沒有那么多公司采用它了。但同時也存在諸多不足:
    1. 不支持存儲過程;
    2. 用C、C++可以比較方便地開發類似于存儲函數之類的東西(就是在SQL語句中可以使用的那種函數),但用Java做同樣的事情就相對很麻煩;
    3. 在觸發器內,不能顯式地執行事務處理;
    4. 無法預先制定觸發器的觸發執行順序。這個從原理上來講,稍微改動一下源碼應該可以做到。
    5. 在缺省情況下,插入數據的性能很糟糕。一秒鐘插入數據記錄的數量通常在20左右。用事務進行批量數據處理,可以大幅度提高insert的性能,但一個事務中批量的上限不能超過500(比如500次insert)。
    而這些特點,在進行某些嵌入式應用開發的時候是非常有用的。因此在使用SQLite數據庫的時候,要充分考慮到這些限制,或者能夠找到可以變通解決問題的辦法。

    本文地址:http://www.portaltwn.com/thread-121269-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷