2016-08-25 14 views
1

xamarinフォームを使用してアンドロイドプラットフォームのネイティブカレンダーに予定を追加しています。私はプラットフォーム間でイベントを追加するための依存関係サービスを作成しました。私はイベントを追加することができますが、イベントを追加する前に、同じユニークな識別子のイベントが存在する場合にそのイベントを追加することを許可しないでください。Xamarin:カレンダーに追加する前にイベントが存在するかどうかを確認してください。

thisを試しましたが、アンドロイドプラットフォームのxamarinにCursorクラスが見つかりませんでしたので、うまくいきませんでした。

+0

[Androidカレンダーに追加する前にイベントが存在するかどうかを確認する](http://stackoverflow.com/questions/13466963/check-if-the-event-exists-before-adding-it-to) -the-android-calender) – hankide

+0

@hankide:私はそれを試みたが、私のために働いていなかった –

答えて

1

Androidの場合、新しいAPIを使用してカレンダーからデータを取得するには、次の手順を実行する必要があります。

あなたはandroid.permisson.READ_CALENDAR

CalendarContractクラスを使用してカレンダーデータとの対話許可が必要です。このクラスは、アプリケーションがカレンダープロバイダと対話するときに使用できるデータモデルを提供します。

カレンダーアプリケーションに登録されているカレンダーを列挙します。これを行うには、ManagedQueryメソッドを呼び出すことができます。少なくとも、カレンダーと返す列のコンテンツUriを指定する必要があります。この列の指定は投影と呼ばれます。 ManagedQueryを呼び出すと、カレンダープロバイダなどのコンテンツプロバイダにデータを問い合わせることができ、カーソルをクエリの結果とともに返します。あなたがNULLの代わりに複数のパラメータを渡すことができ

string[] calendarsProjection = { 
    CalendarContract.Calendars.InterfaceConsts.Id, 
    CalendarContract.Calendars.InterfaceConsts.CalendarDisplayName, 
    CalendarContract.Calendars.InterfaceConsts.AccountName, 
    , CalendarContract.Events.InterfaceConsts.Title 
    , CalendarContract.Events.InterfaceConsts.Dtstart 
    , CalendarContract.Events.InterfaceConsts.Dtend 
}; 

:投影を指定

var calendarsUri = CalendarContract.Calendars.ContentUri; 

。利用可能な他のパラメータを見てくださいhere

var cursor = ManagedQuery (calendarsUri, calendarsProjection, null, null, null); 

管理対象照会は減価償却されていると言われ、それはあなたがContentResolverを使用する方が良いでしょうさ。日付フィルタと

var cursor = context.ContentResolver.Query(calendarsUri, calendarsProjection, null, null, null); 

var selection = "((dtstart <= ?) AND (dtend >= ?))"; 
var selectionArgs = new string[] { startString, endString }; 
Forms.Context.ApplicationContext.ContentResolver.Query(calendarsUri, calendarsProjection, selection, selectionArgs, null); 

または

var ctx = Forms.Context; 
var cursor = ctx.ApplicationContext.ContentResolver.Query(calendarsUri, calendarsProjection, null, null, null); 

Queryへのパラメータは次のとおりです。

  • CR - クエリ
  • に使用するContentResolverの
  • 投影 - 列が
  • はエポックからのUTCミリ秒で
  • 端を照会する時間範囲の-The開始を始める返す - 時間範囲の端をエポックからのUTCミリ秒で照会する

チュートリアル全体とステップバイステップの説明はhereです。 ContentResolverhereについて読む

iOSの場合、EventKitを使用する必要があります。 、それのIDによりイベントを取得EventStoreEventFromIdentifierメソッドを使用し、イベントから引き出されたEventIdentifierそれを渡すために

var mySavedEvent = App.Current.EventStore.EventFromIdentifier (newEvent.EventIdentifier); 

カレンダーのイベントを検索するには、NSPredicateオブジェクトを作成する必要がありますEventStorePredicateForEventsメソッドを使用します。 NSPredicateは、iOSがマッチを見つけるために使用するクエリデータオブジェクトである:

三番目のパラメータは、nullを渡しすべてのカレンダーを使用するには、照会するカレンダーです。

EKCalendarItem[] events = App.Current.EventStore.EventsMatching (query); 

完全なチュートリアルはhere利用可能であり、サンプルのためhereを探す:NSPredicateが作成されると

は、EventStoreのEventsMatchingメソッドを使用して、クエリを実行します。

+0

ManagedQueryメソッドでエラーが発生する。そこには名前空間がありますか? –

+0

私はこれを使用しました:=> var eventsUri = CalendarContract.Events.ContentUri; 文字列[] eventsProjection = { CalendarContract.Events.InterfaceConsts.Title、 CalendarContract.Events.InterfaceConsts.Dtend、 CalendarContract.Events.InterfaceConsts.Dtstart、 }。 var cursor = ctx.ApplicationContext.ContentResolver.Query(eventsUri、eventsProjection、String.Format( "calendar_id = {0}"、1)、null、 "dtstart ASC");どのようにイベントをチェックするためにカーソルをintertateするには特にdtstartとdtend –

+0

@HimanshuDwivedi - パラメタの説明で更新された答えをチェックしてください。エポック日時を開始日と終了日としてQueryに渡します。 –

関連する問題