CoreData и iCloud

Разработвам основно приложение за данни и мислех да добавя поддръжка на iCloud, но след като се огледах в мрежата, често чувах, че iCloud+CoreData е ненадежден и често се поврежда.

Това истина ли е? Една книга, която чета по темата за основните данни, споменава, че iCloud+CoreData е ненадежден в iOS 5, но оттогава е коригиран, но чух и обратното, че iCloud+CoreData все още е ненадежден в iOS 6. Ако е така, съхраняването би базата данни в персонализиран формат помага ли изобщо?


person john smith    schedule 12.06.2013    source източник
comment
Много разработчици все още имат проблеми със синхронизирането на Core Data iCloud дори в iOS 6: вижте тази статия за скорошна гледна точка. Нещата може да са се подобрили в iOS 7: все още е под NDA, така че все още никой не споделя своя опит.   -  person Amy Worrall    schedule 12.06.2013
comment
@Amy Това, което ме обърква е, че някои хора казват, че работи, а други казват, че няма, със сигурност ако има структурни проблеми с iCloud+CoreData, техните ефекти ще бъдат универсални. Между другото свързаната статия споменава TICoreDataSync имали ли сте опит с тази рамка?   -  person john smith    schedule 12.06.2013
comment
Току-що публикувах примерно приложение Core Data в стил библиотека на iOS, което включва iCloud интеграция. Приложението включва пакет с настройки, за да може потребителят да превключва на настройките на предпочитанията за използване на iCloud и ще мигрира магазина към и от iCloud в зависимост от настройките на потребителя. Изтеглете от връзката по-долу - съжалявам за документацията - ще стигнем до това в даден момент, но работи почти по същия начин като примера за UIManagedDocument. ossh.com.au/design-and-technology/software-development   -  person Duncan Groenewald    schedule 14.01.2014


Отговори (3)


Сега, когато iOS 7 беше пуснат, можем да говорим за това. И всичко изглежда показва, че в iOS 7 синхронизирането на iCloud Core Data е коригирано. Предстои ми да добавя iCloud Core Data sync към приложение (само за iOS 7), което създавам, така че все още не мога да говоря от личен опит, но всичко, което чух, предполага, че вече е подходящо за най-доброто време.

Силно препоръчвам да гледате видеоклипа на сесията „Какво е новото в основните данни и iCloud“ от WWDC 2013: https://developer.apple.com/videos/wwdc/2013/?id=207 (изисква членство в програмата за разработчици на Apple). Вече го гледах два пъти и със сигурност са направили нещата много по-ясни.

И накрая, препоръчвам ви да разгледате UbiquityStoreManager в GitHub. Това е библиотека, която до голяма степен върши всички болезнени части на iCloud Core Data вместо вас. Той е модифициран, за да вземе предвид значителните подобрения в iOS 7, но ако искате да се възползвате от тях, приложението ви трябва да е само iOS 7 (това важи независимо дали използвате библиотеката или не).

АКТУАЛИЗАЦИЯ: Откакто публикувах този отговор, сега мога да говоря от личен опит и мога да потвърдя, че Core Data iCloud Sync в iOS 7 е стабилен и нещо повече, невероятно лесен за изпълнение. Добавих го към приложението си, без да използвам UbiquityStoreManager или друга библиотека на трета страна и беше много лесно. Буквално само няколко реда код.

РЕДАКТИРАНЕ: Създадох репо за GitHub с моя стек iCloud Core Data за iOS 7. Надявам се, че помага: https://github.com/mluisbrown/iCloudCoreDataStack

person mluisbrown    schedule 27.09.2013
comment
Можете ли да говорите за личния опит през това време? - person Bright Lee; 23.10.2013
comment
@mluisbrown Става и работи за нула време. Благодаря много! Същността беше лесна за прилагане, но защо отнема толкова време, за да започне външното хранилище след преинсталиране? Има ли начин това да се поправи? - person AlexanderN; 31.10.2013
comment
@AlexanderLongbeach нямам идея, но мисля, че е просто времето, необходимо за достъп до iCloud сървърите. Нищо не можете да направите по въпроса AFAIK. Забелязах, че на симулатора почти трябва да принудите синхронизирането ръчно (⇧⌘I), в противен случай това ще отнеме цяла вечност. Няма проблеми с устройството. - person mluisbrown; 31.10.2013
comment
Това просто интегрирано ли е? Трябва да има повече настройки. Трябва! - person erdekhayser; 20.11.2013
comment
@foriinrangeawesome да, наистина е толкова просто :-) - person mluisbrown; 20.11.2013
comment
@mluisbrown имам само един въпрос. Знаете ли защо бих получил грешката, казвайки entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name в този случай? Промених методите за storeURL и modelURL, така че не съм сигурен защо това се случва. - person erdekhayser; 20.11.2013
comment
@foriinrangeawesome тази грешка означава, че вашето NSManagedObjectContext е нула. Или никога не е инициализирано, или сте го задали на нула някъде. Вижте отговорите на този въпрос: stackoverflow.com/q/11596487/368085. Много малко вероятно е да е свързано с iCloud. - person mluisbrown; 20.11.2013
comment
@mluisbrown Виждам какво не е наред. Моето приложение вече трябва да SQLite файлове, вероятно поради разлика между вашето внедряване на основни данни и моето. По-добре погледнете това по-рано, отколкото по-късно. - person erdekhayser; 20.11.2013
comment
@mluisbrown Знаете ли как да мигрирате съществуващ стек, който не е iCloud, към iCould? - person X.Y.; 26.11.2013
comment
@phantomlimb аз го правя. По принцип просто използвате migratePersistentStore:toURL:options:withType:error: и предоставяте стойността NSPersistentStoreUbiquitousContentNameKey в параметъра за опции. Ако имате нужда от повече информация, по-добре се свържете с мен по имейл, вместо да използвате тези коментари. - person mluisbrown; 26.11.2013
comment
@mluisbrown Благодаря ти! Ще го пробвам и може пак да ви досаждам с имейл! - person X.Y.; 27.11.2013
comment
@mluisbrown Понякога, след като стартирам migratePersistentStore:toURL:options:withType:error: дублирам целия си модел. Изглежда, че в някои случаи iCloud го мигрира автоматично вместо мен. Имате ли идея защо? - person Abras; 29.11.2013
comment
@Abras migratePersistentStore:toURL:options:withType:error: ще мигрира всички данни от един магазин в друг. Не прави откриване на дублиране, това зависи от вас. Така че, ако мигрирате вашия локален магазин към iCloud и след това обратно, ще се окажете с дублирани всички ваши записи. OTOH От време на време съм виждал iCloud да изглежда автоматично да мигрира данни от местен магазин, без изобщо да се обажда на migrate.... Това е грешка. - person mluisbrown; 29.11.2013
comment
@mluisbrown Мисля, че Apple искаше да бъде автоматично. Грешката е, че не се случва през цялото време. Знам, че трябва да открия и премахна дубликати, но няма начин да разбера кога iCloud автоматично го мигрира. Така че няма начин да се открие кога се появяват дубликатите. Единствената ми възможност е да проверявам при всяко ново изпълнение, но това пак ще остави потребителя с дублирани записи за известно време. Да не кажа, че в повечето случаи след мигриране iCloud започва да извежда много различни грешки. - person Abras; 29.11.2013
comment
@Abras @mluisbrown Докато прилагах този стек в моето предварително съществуващо приложение, трябваше да пропусна migrate..., защото се случи автоматично и създаде дублиращи се обекти. По този начин е много удобно и не съм имал проблеми с него (когато внедрих този стек за първи път, написах много код, за да се опитам да мигрирам ръчно, само за да открия, че не ми се налага. Би било по-добре да разберете, преди да бъде написан външният код!) - person erdekhayser; 31.01.2014
comment
Благодарим ви, че споделихте вашия PersistentStack! Използвал съм го, но някои потребители съобщават за загубени данни след актуализация на приложението - някакви идеи? - person hyouuu; 04.03.2014
comment
@hyouuu няма причина актуализацията на приложението да доведе до загуба на данни. Въпреки това, ако приложението бъде изтрито и повторно инсталирано, може да отнеме известно време (няколко минути), за да синхронизира данните си с iCloud и това може да създаде впечатлението, че данните са изчезнали. Това няма нищо общо с PersistentStack, просто iCloud е бавен. - person mluisbrown; 05.03.2014
comment
Благодаря за бързия отговор @mluisbrown! За съжаление потребителят, който съобщи за загуба, изглежда не е изтрил приложението; Друго наблюдение е, че синхронизирането е странно между iPhone и iPad, едно поведение е, че елементите, създадени от iPhone, ще се показват на iPad, но не и обратното. Изпитвали ли сте изобщо подобни проблеми? - person hyouuu; 06.03.2014
comment
@hyouuu Имах подобни проблеми, въпреки че след достатъчно време всичко се синхронизира в крайна сметка. Те са проблеми със самия iCloud, а не с кода. btw, ако искате да продължите това, моля, създайте проблем в GitHub, това не е правилното място за това :) - person mluisbrown; 06.03.2014
comment
Благодаря :) страхотно! Продължете да актуализирате това хранилище на github. Обичам го - person real 19; 17.04.2014
comment
Най-накрая основните данни и iCloud работят заедно! Страхотна работа с GIT, най-добрият отговор в цялата мрежа :-) - person DogCoffee; 27.05.2014
comment
Получих версия на Swift, базирана на iCloudCoreDataStack на @mluisbrown, с малко генериран от Xcode код и техническа поддръжка на Apple, в github. com/hyouuu/iCloudCoreData-Swift Може да съм направил очевидни грешки - моля, помогнете да го подобрим! - person hyouuu; 07.11.2014
comment
Просто се чудя какъв е опитът на всички? Потребителите на приложението ми все още произволно губят данни след актуализация на приложението или не правят нищо от време на време :( - person hyouuu; 20.03.2015
comment
Осъзнавам, че повдигам много мъртва дискусия тук, но някой виждал ли е проблеми с този примерен проект на github след пускането на ios9 / swift2? Имам невероятни проблеми. - person Charlie; 29.10.2015
comment
Нещата все още не са толкова розови, както предполага отговорът. Ние използваме стека iCloud + Core Data откакто беше представен и също така преминахме през всички вътрешни итерации на Apple, за да подобрим стека. Въпреки че е вярно, че текущият стек работи много по-добре от стария, все още имаме непоправими проблеми, които открихме по време на бета тестове през последните няколко седмици (това е основно най-лошият случай: загубени потребителски данни). - person Rafael Bugajewski; 20.01.2016
comment
здравей @mluisbrown знаеш ли дали има друг начин да напишеш публичната база данни като администратор, да зареждаш и поддържаш данни, без да се изисква влизане в icloud? пълен въпрос: stackoverflow.com/questions/36808601/ - person Crashalot; 23.04.2016

Връзката към видеото е променена: https://developer.apple.com/videos/wwdc/2013/?id=207

Редактиране: Това трябва да е коментар към последния отговор, но нямам необходимата репутация 50+ :(

person HeyMan    schedule 05.04.2014
comment
Благодаря. Актуализирах връзката в отговора и гласувах за вашия отговор, за да ви помогна до 50+ представители :) - person mluisbrown; 07.04.2014

В macOS 10.15 и iOS 13 Apple представи NSPersistentCloudKitContainer, който е

Контейнер, който капсулира стека от основни данни във вашето приложение и отразява избрани постоянни магазини към частна база данни на CloudKit.

Връзки:

Документация на Apple: Дублиране на основно хранилище за данни с CloudKit

Примерен код на Apple: Синхронизиране на локален магазин с облака

person vadian    schedule 23.01.2020