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)?
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