そのため、別のサーバー上のデータベースと同期するプログラムを xcode で作成していますが、更新する情報は最後に同期した日付に依存します。「dateLastSynced」タイムスタンプを保存して、プログラムを開いたときに日付スタンプの後に発生した変更を自動的に同期できるようにする最良の方法は何ですか?
1 に答える
明らか[NSDate date]
に現在の日付をNSDate
形式で取得しますが、SQLite データベースに記録している場合は、適切なSQLite 日付と時刻関数を使用することもできますSELECT datetime();
。
ただし、このタイムスタンプをリモート Web サービス要求で使用するパラメーターとして使用している場合 (つまり、サーバーが独自の内部クロックとタイムスタンプ付きレコードに対してチェックするタイムスタンプ)、使用しないことをお勧めします。まったくローカルクロック。そのサーバーから受け取ったタイムスタンプから決定しdateLastSynced
、ローカルクロックをまったく使用しないでください。事実上、Web サーバーのタイムスタンプ メカニズムにプロセスを管理させます。したがって、リモート サーバーから適切なタイムスタンプ フィールドを取得し、それをデータベースのタイムスタンプに格納しますdateLastSynced
。重要なのは、クロックのわずかな調整ミス (さらに悪いことに、ずさんなタイム ゾーン管理) が同期ロジックに悪影響を与えないようにすることです。
個人的には、リモート データベースとローカル データベース間の同期を調整するとき、通常、構成情報用にローカル データベースに 1 行のテーブルを用意し、このサーバー ベースのタイムスタンプをそこに保存します。確かにNSUserDefaults
( Preferences and Settings Programming Guide を参照) または plist などを使用できますが、私は個人的にこの同期タイムスタンプをローカル データベースの状態のプロパティと見なしているため、そこに保持する方が快適だと感じています。他の場所に保管する場合は、データベースを更新する可能性のある他のプロセスを考慮して保管してください (たとえば、ユーザーがアプリを新しい/変更されたデータ構造でバージョン 2.0 に更新する場合の移行計画は何か)。
そのため、1 つの行構成テーブルを持つのはばかげていると感じたとしても、個人的にはデータベース同期情報をデータベース自体に保持します。(余談ですが、構成テーブルにアプリ/データベースのバージョン番号などのフィールドも含める傾向があります。)