我们有一个应用程序会在日历事件发生的月份视图中放置点。我们正在使用日历内容提供商来查看视图。
唯一的问题是我们每月查询内容提供商大约30次:11月1日至30日。因此,我们每天获得正确的实例数。这样,内容提供商本身就使用了重复规则和“多日”事件。 例如: 我们的活动将于11月4日至9日举行。 每天查询内容提供商,我们将在11月4日,5日,6日,7日,8日和9日重播活动。这显然是正确的。但这对性能有非常不利的影响。另一方面,如果我只查询一次:1-30 nov,我只会回到同一个事件一次。所以我需要自己做一些计算来定义事件应该出现在哪个单元格中。
那么,我想知道是否有帮助者或实用程序为我这样做: 1个查询:但是对于在该时间跨度内发生超过一次的事件的单独实例的5倍。
答案 0 :(得分:0)
答案 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()));
}
}