0

次のコードを使用して、コア イベント カレンダー アプリケーションからデータを取得し、アプリに表示しています。

ContentResolver contentResolver = this.getContentResolver();
final Cursor cursor = contentResolver.query(Uri.parse("content://calendar/calendars"),(new String[] { "_id", "displayName", "selected" }),null, null, null);
HashSet<String> calendarIds = new HashSet<String>();
while (cursor.moveToNext()) {
  String _id = cursor.getString(0);
  String displayName = cursor.getString(1);
  Boolean selected = !cursor.getString(2).equals("0");
  calendarIds.add(_id);
}

for (String id : calendarIds) {
                    Uri.Builder builder = Uri.parse(
                            "content://calendar/instances/when").buildUpon();
                    Calendar calendar = Calendar.getInstance();
                    long now = calendar.getTimeInMillis();
                    ContentUris.appendId(builder, now
                            - ((DateUtils.DAY_IN_MILLIS) * 24));
                    ContentUris.appendId(builder, now
                            + ((DateUtils.DAY_IN_MILLIS) * 24));
                    Cursor eventCursor = contentResolver.query(builder.build(),
                            new String[] { "title", "begin", "end", "allDay",
                                    "description", "eventLocation", "dtstart",
                                    "dtend", "eventStatus", "visibility",
                                    "transparency", "hasAlarm" },
                            "Calendars._id=" + id, null,
                            "startDay ASC, startMinute ASC");
    while (eventCursor.moveToNext()) {
                    if (eventCursor != null) {
        String title = eventCursor.getString(0);
    }
}

コードは正常に動作しています。しかし、カレンダーにイベントを追加してアプリに戻ると、新しいイベントが表示されないことがあります。アプリを終了して再び戻るか、タブを変更すると、新しいイベントがリストに追加されます。同期を解決するにはどうすればよいですか?

4

1 に答える 1

1

カレンダーの追加が発生した後にアプリに戻ると、 onResume() が呼び出されます。そこでカーソルを再クエリして、UI を更新します。

また、変更の通知を受けるためのコールバック インターフェースを設定する ContentObserver インターフェースも確認する必要があります (たとえば、アプリをまったく離れていないときに、ネットワーク同期後にデバイスに変更が表示されるとします)。

最後に、CursorAdapter を使用して Cursor から ListView を駆動すると、ContentObserver が自動的にセットアップされ、ここまで到達するために記述しなければならなかった多くのグルー コードが処理されます。これは、はるかに自動化された方法です。

于 2011-04-10T19:11:13.720 に答える