2012-10-10 30 views
2

我的工作列表從日曆事件的代碼,我需要限制日期的範圍,並在例子我看到這個代碼:瞭解使用ContentUris.appendId的查詢日曆提供商

// Construct the query with the desired date range. 
Uri.Builder builder = Instances.CONTENT_URI.buildUpon(); 
ContentUris.appendId(builder, startMillis); 
ContentUris.appendId(builder, endMillis); 

我不明白爲什麼appendId以這種方式使用。 startMillis和endMillis不是ids,我希望參數名稱必須提供,例如「startdate」,我不清楚爲什麼這會起作用,還有哪些其他參數可以用這種方式指定。 appenedId支持更多參數嗎?我怎麼知道?

回答

2

appendId實際上做的是將/#添加到您的uri中,其中#是一個數字。在您的例子(假設startMillis = 1000endMillis = 3000和URI content://com.google.calendar/),這將意味着你的URI最終可能是這樣的:

content://com.google.calendar/1000/3000 

這一點是一個URI解析器可以皮卡:

URIMatcher.addURI(AUTHORITY, calendar + "/#/#", DATE_RANGE); 

長的故事簡而言之:appendId只是一個方便且類型安全的方法,可以將整數添加到您的uri路徑中。

0

我也試圖瞭解更多關於ContentUris的內容,因爲我有一段代碼在CalendarContract Instances表中不起作用。這很奇怪,因爲我不需要將它們傳遞給我開發的日曆或事件表查詢。

因此,我添加了appendId語句,並在當前UTC時間傳遞了兩個值,現在代碼正常工作。我的代碼中的實際查詢使用當前時間查找當前事件 - 請參閱下面的代碼。如果我將appendID語句取出,則會引發異常 - 我認爲這是類似於Content Provider URL未找到的內容。

String instanceQuery = "EVENT_ID = " + event_id + 
        " AND begin <= " + now + 
        " AND end >= " + now; 


Uri.Builder eventsUriBuilder = CalendarContract.Instances.CONTENT_URI.buildUpon(); 
ContentUris.appendId(eventsUriBuilder, now); 
ContentUris.appendId(eventsUriBuilder, now); 
Uri eventsUri = eventsUriBuilder.build(); 
Cursor instanceCursor = null; 
instanceCursor = ctx.getContentResolver().query(eventsUri, 
    new String[] { CalendarContract.Instances.EVENT_ID, 
    CalendarContract.Instances.BEGIN, 
    CalendarContract.Instances.END}, 
    instanceQuery, 
    null, 
    null); 

我的代碼正在工作,但我想知道appendID語句實際上有什麼影響,例如,這些值添加任何約束。它看起來像我的實際查詢重寫任何傳入的隱含範圍,我真的不明白爲什麼他們是必需的。

希望從更瞭解這一點的人那裏得到一個簡短的解釋會有利於開發者社區......