搜尋此網誌

2011年11月1日 星期二

如何在android 中查詢來電記錄使用日期過濾(CallLog filter DATE)

如何在android 中查詢來電記錄使用日期過濾
       cursor  = this.managedQuery(
                android.provider.CallLog.Calls.CONTENT_URI,
                strFields,               
                android.provider.CallLog.Calls.DATE+" >='"+sdate+"'",
                null,
                strOrder
                );
sdate='2011-11-1'
之前使用上列的字串日期來查詢,但總是傳回0筆資料               
為了解決這個問題,google查了好久,但始終找不到解法
最後決定由sqlite3 資料庫來查看要如何解決
來電記錄的 db 檔在 cd /data/data/com.android.providers.contacts/databases/contacts2.db 裏

先用 adb shell 進入 command shell
cd /data/dara/android.provider.contacts/databases/
sqlite3 contacts2.db
進入 sqlite3
先看一下來電記錄裏的資料長得怎樣
sqlite> select * from calls;
select * from calls;
1|0387232|1319211664323|0|1|1||0|
2|0387232|1319211858582|0|1|1||0|
3|0388709|1319715842190|8|1|1|huang|1|
4|0832413|1320148395215|2|1|1||0|

單獨select 出 date
sqlite> select date from calls;
select date from calls;
1319211664323
1319211858582
1319715842190
1320148395215

發現date 存在資料庫是 long 的數字型態,代表1970/1/1 至今的毫秒數
查了一下 sqlite3 的日期 function
可以用下列指令轉換為字串
SELECT datetime(date/1000, 'unixepoch') from calls;
2011-10-21 15:41:04
2011-10-21 15:44:18
2011-10-27 11:44:02
2011-11-01 11:53:15

終於得到正確的日期字串
再配合substr總算可以用字串日期過濾了
SELECT * from calls where substr(datetime(date/1000, 'unixepoch'),1,10)='2011-11-01';

把之前的query 條件改成下列
       cursor  = this.managedQuery(
                android.provider.CallLog.Calls.CONTENT_URI,
                strFields,               
                "substr(datetime("+android.provider.CallLog.Calls.DATE+"/1000, 'unixepoch'),1,10) ='"+sdate+"'",
                null,
                strOrder
                );
               
成功的傳回資料了

沒有留言: