CoreData срещу Realm (в Swift)

След като преминах от CoreData към Realm, реших, че би било полезно да отбележа основните разлики.

Първо, не използвам облачните функции на Realm и вероятно ще използвам iCloud за синхронизиране на данни. Избирам безплатни услуги и Realm е свободен за използване, ако не е необходимо да синхронизирате чрез тяхната облачна платформа.

И CoreData, и Realm използват класове, базирани на Objective-C, за да създадат истински обекти, които са подкрепени от някакъв магазин. CoreData използва sqllite база данни по подразбиране, така че ще ви трябват някои sqllite инструменти за преглед и редактиране на базата данни на ръка. Realm използва патентован формат, но имат достъп до браузъра в Mac App Store безплатно за преглед и редактиране на базата данни.

Извън кутията Realm е много по-лесно да си вземете главата, отколкото CoreData. CoreData управлява обектите изрично в ManagedObjectContext, който трябва да запазите, за да продължите всички промени, докато Realm продължава всички промени незабавно в блокове за запис. За да използвате CoreData, се нуждаете от дълбоко разбиране на API, който е разпространен в редица свързани класове. Можете почти да скочите направо с Realm. Основно предимство, което открих, е, че промените в Realm продължават незабавно, ако приложението ви се срине или излезете от симулатора, можете да проверите базата данни, за да видите как изглежда. Използването на CoreData, просто спирането на емулатора, без първо да запазите контекста, означава, че в този момент губите състоянието на базата данни. Това е почти достатъчно само по себе си, за да ме накара да се придържам към Realm. Може да е по-малко ефективен и можете просто да запазите контекста при всяка промяна в CoreData, но изглежда, че работите срещу API, когато започнете да правите такива неща. Струва си да се помни, че Realm блоковете при писане и достъп ще причинят изключение на нишка, ако не се изпълни на основната нишка.

Създаването на схема също се различава, като с помощта на CoreData изграждате модел в XCode, който генерира класовете, използвани за инсталиране на данните в обекти. Отново Realm е по-проста, тъй като просто трябва да наследявате от Object и да маркирате свойства, които искате да запазите като @objc динамичен. Има няколко функции, които можете да отмените, за да помогнете да персонализирате начина, по който вашите обекти продължават и т.н. Харесва ми визуалното представяне на модела в XCode и може би е по-лесно да работите с взаимоотношенията между много и много-много редактор на модела XCode, отколкото е да се използва функцията LinkingObjects () в Realm.

Мисля за клас Realm като дефиниция на таблица и лесно можете да получите набор от резултати на живо, като се обадите на realm.objects (MyObject.self), който ще продължи да се активира, когато редовете се добавят, изтриват или актуализират. Можете да добавите предикати към набора от резултати, така че да получавате предварително филтрирани и сортирани резултати или да ги картографирате в масив. В CoreData можете да правите подобни неща, но отново API в Realm е по-прост.

CoreData ви позволява да зададете как да се справите с нулевите препратки, което е удобно, ако искате изтриването да се каскадира и да не оставяте базата си данни пълна с нули или препратки към обекти, които вече не съществуват. Това трябва да идва в ново издание, но дотогава написах API за каскадно изтриване за Realm, който ще публикувам своевременно.

В заключение, след като се опитах да науча достатъчно за CoreData, за да го използвам, не бях склонен да премина към друго, освен относителната простота на Realm и факта, че е точно толкова по-приятелски при многократно стартиране и затваряне на симулатора означава, че бих препоръчал да използвате Realm над CoreData.