17

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

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

那么,我想知道是否有一个帮助程序或实用程序可以为我执行此操作: 1 个查询:但是对于在该时间跨度内发生一次以上的事件,一个单独的实例有 5 次。

4

3 回答 3

0

您可以查询字段rruledtstartdtendCalendarContract.EventsURI 中查询并使用它们来计算特定日期。检查此链接以获取有关字段含义的描述以及此链接

于 2013-11-12T13:43:37.503 回答
0

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

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

希望对你有帮助,Techfist

于 2013-11-18T10:20:38.770 回答
-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()));    
}
}
于 2014-10-19T17:31:17.407 回答