Запрос провайдера содержимого календаря в течение месяца, но отображение экземпляров в день

У нас есть приложение, которое помещает точки в месяц, где происходят события календаря. Мы используем поставщика содержимого календаря для просмотра представления.

Единственная проблема заключается в том, что мы запрашиваем контент-провайдера около 30 раз в месяц: 1 - 30 ноября. Таким образом, мы получаем правильное количество экземпляров в день. Таким образом, сам контент-провайдер использует правила повторения и "многодневные" события. Например: У нас есть событие, которое состоится с 4 по 9 ноября. Ежедневно запрашивая контент-провайдера, мы получим это событие: 4, 5, 6, 7, 8 и 9 ноября. Это, безусловно, правильно. Но это очень негативно сказывается на производительности. С другой стороны, если я запрашиваю только один раз: 1-30 нов, я получаю одно и то же событие только один раз. Поэтому мне нужно сделать некоторые вычисления самостоятельно, чтобы определить, в каких ячейках должно появиться событие.

Итак, мне было интересно, есть ли помощник или полезность, которая делает это для меня: 1: Но 5 раз отдельный экземпляр для события, которое происходит более одного раза в это время.

Ответ 1

Вы можете запросить поля rrule, dtstart и dtend из URI CalendarContract.Events и использовать их для расчета конкретных дат. Проверьте ссылку для описания значения поля, а также ссылку .

Ответ 2

Почему бы вам не проверить таблицу экземпляров базы данных Calendar, я столкнулся с аналогичной проблемой производительности, и эта таблица разрешила это. Он в основном сохраняет все повторяющиеся события как отдельные экземпляры, короче, если событие должно произойти в течение следующих 5 дней, эта таблица будет содержать пять записей для одного события с подробным описанием его атрибута.

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

Надеюсь, что это поможет, Techfist

Ответ 3

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()));    
}
}