19

iOSアプリの一部のデータをローカルの.sqliteファイルに直接保存します。データはApple以外のプラットフォームと互換性がある必要があるため、CoreDataの代わりにこれを行うことにしました。

今、私はこのファイルをiCloud経由で同期するための最良の方法を考え出そうとしています。多くの理由で、直接同期できないことはわかっています。CoreDataがDBを同期できることは知っていますが、CDを使用すると本質的にこのファイルがAppleプラットフォームにロックされることを無視しても(CDを少し調べただけだと思います)、このファイルのiCloud同期が機能する必要がありますiCloudでサポートされているすべてのプラットフォーム-これにはWindowsが含まれているはずです。WindowsAPIのCoreDataファイルには互換性がないと想定する必要があります。これを達成するための最良の方法を計画することは、Appleが「WindowsAPIが[最終的には?]」以上のことを私たちに教えてくれれば、はるかに簡単になるでしょう。

さらに、iCloudがサポートしていないプラットフォームをサポートするには、最終的に少なくとももう1つの同期サービスを実装する必要があります。私がiCloudに使用している方法が、将来のサービスでほとんど再利用できるのであれば、必須ではありませんが、役に立ちます。

これらの理由から、CoreDataがこれを支援することはできないと思います。私はこれを考えるのは正しいですか?

そこから先に進むと、このためのアルゴリズムを考案するか、既存のアルゴリズムまたは既存のサードパーティソリューションを見つける必要があります。私はまだ何にも遭遇していません。しかし、私は実装できるいくつかの可能な方法を検討してきました。

方法1:

CoreDataがsqliteDBを同期する方法と同様のことを行います。代わりに、「トランザクションログ」をiCloudに送信し、それらから各ローカルsqliteファイルを構築します。

各デバイスは、そのデバイスが実行したすべてのSQLコマンドをタイムスタンプとともにリストした(一意の名前の)テキストファイルを送信すると思います。デバイスは、実行したコマンドの各リストにどれだけ進んだかを保存し、ファイルが更新されるたびにその時点から続行します。一度に複数のログファイルの更新を受信した場合、タイムスタンプ順に各コマンドを実行します。

これらのファイルが大きくなると、効率的に「興味深い」ものになる可能性がありますが、それは解決可能な問題のようです。  

方法2:

作業中のデータベースのコピーを定期的にiCloudに同期します。すべてのレコードに変更タイムスタンプフィールドがあります。DBの更新されたコピーが届いたら、ある参照時間よりも新しいタイムスタンプを持つすべてのレコードをクエリし、新しいデータからローカルDBのレコードを更新します。

この方法には多くの潜在的な問題があります。

-レコードの削除を認識するために、さらに何かを実装する必要があります。

-DBファイルが競合する可能性があります。各競合バージョンをタイムスタンプ順に処理することで、それらに対処できる可能性があります。

-更新元のデバイスによって異なるため、各更新を確認する日付を決定するのは難しい場合があります。

方法2には多くの潜在的な問題がありますが、方法1私には実行可能のようです...

誰かが最善の行動方針について何か提案がありますか?私の「方法1」(またはそれが機能しない理由)よりも優れたアイデアはありますか?

4

3 に答える 3

3

Ray Wenderlich の次の 2 つのソリューションを試してください。

メールによるデータのエクスポート/インポート: http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

iTunes とのファイル共有: http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

とても複雑だと思いましたが、とても役に立ちました。

于 2011-11-28T20:34:12.030 に答える
1

方法 1 と方法 2 の両方が実行可能のようです。おそらく、実際には 2 つの組み合わせ - iCloud を使用して、データのサブセットである別のデータベース ファイルを送信します - つまり、変更されたアイテムだけです。または、sqlite db の代わりに別のファイル形式 (XML/JSON/CSV など) を使用することもできます。

もう 1 つの方法は、iCloud の外で行うことです。つまり、同期用の単純なカスタム Web サービスです。そのため、各変更は HTTP 経由の JSON/XML 経由で中央サーバーに送信され、他のデバイスはそこから更新を取得します。

明らかに、同期するデータの量とデバイスの数、および適切なサーバーにアクセスできるかどうか、および/またはそのようなサーバーの実行をカバーする予算があるかどうかによって異なります. iCloudは「無料」でそれを行いますが、実際に行うのはファイルの転送だけです。カスタム ソリューションを使用すると、必要に応じて同期モデルを定義できますが、それを開発および管理し、料金を支払う必要があります。

于 2012-02-16T15:13:56.847 に答える
0

私はiCloudを介してデータベースファイルを転送する可能性を検討しましたが、アプリが複数のデバイスで同時に実行されると、タイミングの古典的な問題(ユーザーの起動が遅い)とデータベースの破損に遭遇すると思います。(iPad / iPhoneなど)。

すっごく。トランザクションログ方式を使用する必要がありました。実装するのは本当に難しいですが、一度配置すれば問題ないようです。

この作業のベースとして、AppleのSharedCoreDataサンプルを使用しています。このリンクにはAppleDeveloperアカウントが必要です。

私はTimRoadleyからはるかに優れたソリューションを見つけましたが、これはIOSでのみ機能し、IOSとMacOSの両方が必要でした。

rant> iCloudの開発は本当に簡単で安定している必要があります!/ rant

于 2012-11-16T04:33:29.070 に答える