2011-11-15 13 views
18

Przechowuję niektóre dane w mojej aplikacji na iOS bezpośrednio w lokalnym pliku .sqlite. Wybrałem to zamiast CoreData, ponieważ dane będą musiały być kompatybilne z platformami innymi niż Apple.Synchronizowanie lokalnego pliku sqlite z iCloud

Teraz próbuję wymyślić najlepszy sposób zsynchronizowania tego pliku przez iCloud. Wiem, że nie możesz zsynchronizować go bezpośrednio z wielu powodów. Wiem, że CoreData jest w stanie zsynchronizować swoje bazy danych, ale nawet ignorując fakt, że użycie CD w zasadzie zablokuje ten plik na platformach Apple (myślę, że zajrzałem tylko do CD), potrzebuję synchronizacji tego pliku z iCloud do pracy WSZYSTKIE obsługiwane platformy iCloud - które mają obejmować system Windows. Muszę założyć, że nie będzie żadnej zgodności dla plików CoreData w Windows API. Planowanie najlepszego sposobu na osiągnięcie tego byłoby o wiele łatwiejsze, gdyby firma Apple powiedziała nam coś więcej niż "Będzie jeszcze Windows API [ostatecznie?]"

Ponadto będę musiał wdrożyć co najmniej jeden więcej usługi synchronizacji, aby wspierać platformy, których nie ma. Byłoby pomocne, choć nie jest to wymagane, jeśli metoda, której używam dla usługi iCloud, może być w większości ponownie wykorzystana do przyszłych usług.

Z tych powodów nie sądzę, że CoreData może mi w tym pomóc. Czy mam rację, myśląc o tym?

Idąc dalej, muszę opracować algorytm dla tego lub znaleźć istniejące lub istniejące rozwiązanie innej firmy. Nie natknąłem się jeszcze na nic. Ja jednak zostały rozmyślałem nad parą możliwych sposobów mogłaby wdrożyć:

Metoda 1:

zrobić coś podobnego do tego, jak CoreData synchronizuje SQLite DB: wyślij „dzienniki transakcji” do iCloud i zamiast budować każdą lokalnego pliku sqlite z nich.

Myślę, że każde urządzenie wysłałoby (unikalnie nazwany) plik tekstowy zawierający listę wszystkich poleceń sql wykonanych przez to urządzenie ze znacznikami czasu. Urządzenie będzie zapisywać odległość na każdej liście poleceń, które wykonał, i kontynuować od tego punktu za każdym razem, gdy plik zostanie zaktualizowany. Jeśli otrzyma aktualizacje do wielu plików dziennika jednocześnie, wykona każde polecenie w kolejności znacznika czasu.

Rzeczy mogą stać się "interesujące" pod względem wydajności, gdy pliki te będą duże, ale wydaje się, że jest to problem, który można rozwiązać.

Metoda 2:

Okresowo zsynchronizować kopię bazy roboczej iCloud. Posiadaj pole znacznika modyfikacji w każdym rekordzie. Po przejściu zaktualizowanej kopii bazy danych zapytaj wszystkie rekordy nowszymi znacznikami czasu niż jakiś czas odniesienia i zaktualizuj rekord w lokalnej bazie danych z nowych danych.

widzę wiele potencjalnych problemów z tą metodą:

-Czy zaimplementować coś dalszego rozpoznania usunięcie rekordu.

- Plik DB może powodować konflikty. Można poradzić sobie z nimi, posługując się każdą wersją konfliktu w porządku znacznika czasu.

- Określenie daty każdej aktualizacji może być trudne, ponieważ zależy to od urządzenia, z którego pochodzi aktualizacja.

Istnieje wiele potencjalnych problemów z metodą 2, ale metoda 1 wydaje mi się ...

Czy ktoś ma jakieś sugestie, co może być najlepszym sposobem działania? Jakieś lepsze pomysły niż moja "Metoda 1" (lub powody, dla których to nie zadziałałoby)?

Odpowiedz

3

Wypróbuj te dwa rozwiązania z Ray Wenderlich:

Eksport/Import danych za pośrednictwem poczty: Udostępnianie http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

plików z iTunes: http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

Znalazłem to dość skomplikowane, ale bardzo mi pomogło .

+2

Służą do prostego przesyłania plików (co iCloud robi). Problemem jest odzwierciedlenie zmian w pliku bazy danych, który istnieje na wielu urządzeniach. Nie mogę skopiować jednej kopii do innych urządzeń, ponieważ wersja na każdym urządzeniu może mieć unikalne zmiany. W każdym razie, skończyłem wdrażać "Metodę 1" i działa to do tej pory ... – JDR

1

Wydaje się, że zarówno metoda 1, jak i metoda 2 są wykonalne. Być może połączenie dwóch z nich - użyj iCloud, aby wysłać osobny plik bazy danych, który jest podzbiorem danych - czyli właśnie zmieniono elementy. A może inny format pliku zamiast sqlite db - XML ​​/ JSON/CSV itp.

Inną alternatywą jest zrobienie tego poza usługą iCloud - czyli prosta niestandardowa usługa internetowa do synchronizacji. Tak więc każda zmiana jest przesyłana do centralnego serwera za pośrednictwem JSON/XML przez HTTP, a następnie inne urządzenia pobierają aktualizacje z tego.

Oczywiście zależy to od ilości danych i liczby urządzeń, które mają być zsynchronizowane, oraz od tego, czy masz dostęp do odpowiedniego serwera i/lub budżetu, aby objąć korzystanie z takiego serwera. iCloud zrobi to za darmo, ale tak naprawdę to tylko transfer plików. Niestandardowe rozwiązanie pozwala zdefiniować model synchronizacji według własnego uznania, ale musisz go opracować i zarządzać nim, a za to zapłacić.

0

Rozważałem możliwość przeniesienia pliku bazy danych przez iCloud, ale myślę, że natrafiłbym na klasyczne problemy z czasem - wolny start dla użytkownika - i uszkodzone bazy danych, jeśli aplikacja działa jednocześnie na wielu urządzeniach. (na przykład iPad/iPhone).

Sooo. Musiałem użyć metody dzienników transakcji. Naprawdę trudno to zaimplementować, ale raz na miejscu wydaje się, że jest OK.

Używam próbki Apple SharedCoreData jako podstawy dla tej pracy. Ten link wymaga konta programisty Apple.

Znalazłem o wiele lepsze rozwiązanie od Tim Roadley, ale działa to tylko na IOS i potrzebowałem zarówno IOS, jak i MacOS.

rant> Rozwój iCloud naprawdę musi stać się łatwiejszy i bardziej stabilny!/rant

Powiązane problemy