Die Synchronisation einer lokalen sqlite-Datei zu iCloud
Ich Speichere einige Daten in meiner iOS-app direkt in ein lokal .sqlite-Datei. ich wählte dazu statt CoreData, da die Daten benötigen, um die Kompatibilität mit nicht-Apple-Plattformen.
Nun, ich bin versucht zu kommen mit die beste Möglichkeit zum synchronisieren dieser Datei über iCloud. ich weiß, Sie können nicht synchronisiert es direkt, aus vielen Gründen. ich weiß, CoreData ist in der Lage, synchronisieren Sie Ihre Datenbanken, sondern auch ignoriert, dass die Verwendung von CD würde im wesentlichen zu sperren diese Datei in Apple-Plattformen (denke ich?! Ich habe nur geschaut in die CD ein bisschen), ich muss die iCloud-Synchronisierung für diese Datei für ALLE iCloud unterstützten Plattformen - das soll ja auch Windows. ich muss davon ausgehen, dass es keine Kompatibilität für die CoreData-Dateien in der Windows-API. die Planung der beste Weg, dies zu erreichen, wäre viel einfacher, wenn Apple Ihnen sagen würde, uns mehr als "Es wird ein Windows-API [irgendwann?]"
Darüber hinaus werde ich schließlich implementieren müssen, mindestens eine weitere sync-Dienst zur Unterstützung von Plattformen, die iCloud nicht. Es wäre hilfreich, jedoch nicht zwingend erforderlich, wenn die Methode, die ich verwenden für die iCloud können meist wiederverwendet werden für die zukünftigen Leistungen.
Aus diesen Gründen, glaube ich nicht, CoreData kann mir dabei helfen. Bin ich richtig im denken das?
Bewegt von dort aus, muss ich erarbeiten einen Algorithmus für dieses, oder finden Sie eine vorhandene oder eine vorhandene 3rd-party-Lösung. habe ich noch nicht gestolpert noch nichts. Allerdings habe ich schon grübelte über ein paar mögliche Methoden, die ich umsetzen konnte:
Methode 1:
Etwas tun, ähnlich wie CoreData synchronisiert sqlite-DBs: senden Sie "transaction log" - iCloud statt und bauen jedes lokale sqlite-Datei, aus der diese.
Ich denke, jedes Gerät senden würde, der einen (den eindeutigen Namen) text-Datei mit der Auflistung aller sql-Befehle, die das Gerät ausgeführt,, mit Zeitstempel. Das Gerät speichern, wie weit in jeder Liste der Befehle ausgeführt hat, und weiter von diesem Punkt jedes mal, wenn die Datei aktualisiert wird. Wenn es updates zu empfangen, um mehrere log-Dateien auf einmal, es würde ausführen der einzelnen Befehle in chronologischer Reihenfolge.
Dinge bekommen konnte "interessant" Effizienz-Weise, wenn diese Dateien sehr groß werden, aber wie es scheint, ein lösbares problem.
Methode 2:
Regelmäßig synchronisieren kopieren der Datenbank auf "iCloud". eine modification timestamp-Feld in jedem Datensatz. Wenn Sie eine aktualisierte Kopie der DB kommt durch, Abfrage alle Datensätze mit neueren Zeitstempel als einige Referenz-Zeit und update der Datensatz in der lokalen DB aus den neuen Daten.
Sehe ich viele potentielle Probleme mit dieser Methode:
-Implementieren müssen, um etwas weiter zu erkennen, Datensatz löschen.
-Die DB-Datei bekommen könnte Konflikte. Es könnte möglich sein Umgang mit Ihnen durch die Bearbeitung eines jeden Konflikts version in chronologischer Reihenfolge.
-Bestimmung das Datum zu überprüfen, jedes update kann tückisch sein, wie es hängt davon ab, welche Geräte das update kommen wird.
Gibt es eine Menge potenzieller Probleme mit der Methode 2, Methode 1 scheint machbar für mich...
Hat jemand irgendwelche Vorschläge, was könnte die beste Vorgehensweise? Eine bessere Idee als meine "Methode 1" (oder Gründe warum es nicht funktionieren würde)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie, diese beiden Lösungen von Ray Wenderlich:
Exportieren/Importieren von Daten über E-mail:
http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app
File-Sharing mit iTunes:
http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app
Fand ich es ziemlich Komplex, aber hat mir viel geholfen.
Sowohl Methode 1 und Methode 2 scheint machbar. Vielleicht ist eine Kombination der beiden in der Tat - verwenden Sie iCloud zu senden, eine separate Datenbank-Datei, die eine Teilmenge der Daten, d.h. nur geänderte Elemente. Oder vielleicht ein anderes Datei-format anstelle der sqlite-db - XML/JSON/CSV etc.
Andere alternative ist, es zu tun außerhalb des iCloud - d.h. eine einfache benutzerdefinierte web-service für die Synchronisierung. So wird jede änderung vorgelegt wird, an einen zentralen server über JSON/XML über HTTP, und dann mit anderen Geräten ziehen Sie die updates aus, die.
Natürlich, es hängt davon ab, wie viele Daten und wie viele Geräte, die Sie synchronisieren möchten über, und ob Sie Zugriff auf einen entsprechenden server und/oder budget für solch einen server. iCloud machen das für "frei", aber es wirklich tut, ist die übertragung von Dateien. Eine benutzerdefinierte Lösung, die Ihnen erlaubt zu definieren, die Synchronisierung von Modell, wie Sie wollen, aber Sie haben sich zu entwickeln und zu verwalten und zu bezahlen.
Ich habe als die Möglichkeit der übertragung einer Datenbank-Datei mit der iCloud, aber ich denke, dass würde ich in klassische Probleme der timing - langsamen start für das Benutzer - und-beschädigte Datenbanken, wenn die app auf mehreren Geräten gleichzeitig. (iPad/iPhone zum Beispiel).
Sooo. Ich habe zu verwenden, die Transaktionsprotokolle Methode. Es ist wirklich schwer zu implementieren, aber einmal im Ort, scheint ok.
Ich bin, mit der Apple - SharedCoreData Beispiel als Basis für diese Arbeit. Dieser link erfordert einen Apple Developer Account.
Fand ich eine viel viel bessere Lösung von Tim Roadley das funktioniert jedoch nur für IOS und ich brauchte beide IOS und MacOS.
rant> iCloud-Entwicklung wirklich einfacher und stabiler! /rant