在一个月的时间内查询日历内容提供商,但每天显示实例

时间:2013-11-04 19:06:28

标签: android android-calendar

我们有一个应用程序会在日历事件发生的月份视图中放置点。我们正在使用日历内容提供商来查看视图。

唯一的问题是我们每月查询内容提供商大约30次:11月1日至30日。因此,我们每天获得正确的实例数。这样,内容提供商本身就使用了重复规则和“多日”事件。 例如: 我们的活动将于11月4日至9日举行。 每天查询内容提供商,我们将在11月4日,5日,6日,7日,8日和9日重播活动。这显然是正确的。但这对性能有非常不利的影响。另一方面,如果我只查询一次:1-30 nov,我只会回到同一个事件一次。所以我需要自己做一些计算来定义事件应该出现在哪个单元格中。

那么,我想知道是否有帮助者或实用程序为我这样做: 1个查询:但是对于在该时间跨度内发生超过一次的事件的单独实例的5倍。

3 个答案:

答案 0 :(得分:0)

您可以从rrule URI查询字段dtstartdtendCalendarContract.Events,并使用它们来计算具体日期。请查看此link以获取有关字段含义的说明以及此link

答案 1 :(得分:0)

为什么不检查Calendar数据库的Instances表,我遇到了类似的性能问题,此表解决了这个问题。它基本上将事件的所有重复作为单独的实例保存,简而言之,如果事件必然会在接下来的5天内发生,则此表将有五个条目用于详细说明其属性的相同事件。

http://developer.android.com/reference/android/provider/CalendarContract.Instances.html

希望它有所帮助, Techfist

答案 2 :(得分:-1)

private static final String DEBUG_TAG = "MyActivity";
public static final String[] INSTANCE_PROJECTION = new String[] {
Instances.EVENT_ID,      // 0
Instances.BEGIN,         // 1
Instances.TITLE          // 2
};

// The indices for the projection array above.
private static final int PROJECTION_ID_INDEX = 0;
private static final int PROJECTION_BEGIN_INDEX = 1;
private static final int PROJECTION_TITLE_INDEX = 2;
...

// Specify the date range you want to search for recurring
// event instances
Calendar beginTime = Calendar.getInstance();
beginTime.set(2011, 9, 23, 8, 0);
long startMillis = beginTime.getTimeInMillis();
Calendar endTime = Calendar.getInstance();
endTime.set(2011, 10, 24, 8, 0);
long endMillis = endTime.getTimeInMillis();

Cursor cur = null;
ContentResolver cr = getContentResolver();

// The ID of the recurring event whose instances you are searching
// for in the Instances table
String selection = Instances.EVENT_ID + " = ?";
String[] selectionArgs = new String[] {"207"};

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

// Submit the query
cur =  cr.query(builder.build(), 
INSTANCE_PROJECTION, 
selection, 
selectionArgs, 
null);

while (cur.moveToNext()) {
String title = null;
long eventID = 0;
long beginVal = 0;    

// Get the field values
eventID = cur.getLong(PROJECTION_ID_INDEX);
beginVal = cur.getLong(PROJECTION_BEGIN_INDEX);
title = cur.getString(PROJECTION_TITLE_INDEX);

// Do something with the values. 
Log.i(DEBUG_TAG, "Event:  " + title); 
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(beginVal);  
DateFormat formatter = new SimpleDateFormat("MM/dd/yyyy");
Log.i(DEBUG_TAG, "Date: " + formatter.format(calendar.getTime()));    
}
}