SlideShare a Scribd company logo
1 of 12
Введение в Realm
Realm представляет собой мобильную базу данных: замена для SQLite
& Core Data
iOS:
Приложения, использующие Realm могут работать: iOS7 или выше, OS
X 10.9 или выше, WatchKit.
Xcode 6.4 или выше.
Objective-C, Swift 1.2 & Swift 2.x поддерживаются.
Android:
JDK версии> = 7.
Все Android версии начиная с уровня API 9 (Android 2.3 Gingerbread и
выше) поддерживаются.
Модели (code-first approach)
@class Person;
// Dog model
@interface Dog : RLMObject
@property NSString *name;
@property Person *owner;
@end
RLM_ARRAY_TYPE(Dog) // define RLMArray<Dog>
// Person model
@interface Person : RLMObject
@property NSString *name;
@property NSDate *birthdate;
@property RLMArray<Dog *><Dog> *dogs;
@end
RLM_ARRAY_TYPE(Person) // define RLMArray<Person>
Модели данных Realm определяются с помощью классов Objective-C со свойствами.
Унаследуйте RLMObject или существующий класс модели для создания объектов модели
данных Realm. Объекты Realm в основном функционируют как и любые другие объекты
Objective-C - вы можете добавить свои собственные методы и протоколы к ним и
использовать их, как и любой другой объект. Основные ограничения в том, что вы можете
использовать объект только в потоке, в котором он был создан, и вы не можете получить
доступ к его ivar для обращения к его свойствам
Типы данных
Realm поддерживает следующие типы данных: BOOL, INT, NSInteger, float, double,
NSString, NSDate (обрезается до секунд), NSData и NSNumber помеченый
определенным типом, напр. NSNumber<RLMInt>.
Вы можете использовать RLMArray <Object *> <Object> и RLMObject чтобы
моделировать такие связи (relations), как to-many и to-one.
RLMArrays поддерживают дженерики Objective-C во время компиляции. Вот что
означают различные компоненты определения свойства, и почему они полезны:
RLMArray: Тип свойства.
<Object *>: Специализация дженерика. Это помогает предотвратить
использование массива с неправильным типом объекта во время компиляции.
<Объект>: Протокол, который поддерживает этот RLMArray. Это позволяет Realm
знать, как специализировать схемы этой модели во время выполнения.
Отношения (relationships)
To-One отношения
Для many-to-one or one-to-one отношений, просто определите свойство типа
наследника RLMObject
// Dog.h
@interface Dog : RLMObject
// ... other property declarations
@property Person *owner;
@end
To-Many отношения
Вы можете определить отношение to-many, используя свойства RLMArray.
RLMArray содержат другие объекты одного типа и имеют интерфейс, очень
похожий на NSMutableArray.
Чтобы добавить свойство dogs в нашей модели Person, которая позволяет
установить отношение с несколькими объектами Dog, мы должны сначала
определить тип RLMArray <Dog>. Это делается с помощью макроса в нижней
части соответствующей модели интерфейса
@interface Person : RLMObject
@property NSString *name;
@property NSDate *birthdate;
@property RLMArray<Dog *><Dog> *dogs;
@end
RLM_ARRAY_TYPE(Dog) // define RLMArray<Person>
Миграция приложений с Core Data
на Realm
1. Удалить Core Data Framework
2. Удалить код инициализации Core Data
В Core Data, изменения объектов производятся в объектах managed object
context. Объекты managed object context создаются в рамках persistent store
coordinator, который, в свою очередь, связан с managed object model
RLMRealm *defaultRealm = [RLMRealm defaultRealm];
3. Мигрировать файлы моделей
Унаследовать от RLMObject вместо NSManagedObject
@implementation Dog
+ (NSString *)primaryKey
{
return @"uuid";
}
+ (NSDictionary *)defaultPropertyValues
{
return @{ @"uuid" : [[NSUUID UUID] UUIDString],
@"name" : @"",
@"birthdate" : [NSDate date]};
}
@end
В то время как объекты основных данных, имеют внутреннее свойство
NSManagedObjectID чтобы однозначно идентифицировать объекты, Realm
оставляет это решение на Вас, как разработчика. В приведенном выше примере,
добавляется дополнительное свойство с именем UUID, а затем используется
метод [RLMObject PrimaryKey], чтобы пометить его как уникальный
идентификатор для этого класса. Тем не менее, если ваши объекты вообще не
должны быть однозначно определен, все это может быть пропущено.
4. Миграция операций записи
CoreData:
//Create a new Dog
Dog *newDog = [NSEntityDescription insertNewObjectForEntityForName:@"Dog"
inManagedObjectContext:myContext];
newDog.name = @"McGruff";
//Save the new Dog object to disk
NSError *saveError = nil;
[newDog.managedObjectContext save:&saveError];
//Rename the Dog
newDog.name = @"Pluto";
[newDog.managedObjectContext save:&saveError];
Realm:
//Create the dog object
Dog *newDog = [[Dog alloc] init];
newDog.name = @"McGruff";
//Save the new Dog object to disk (Using a block for the transaction)
RLMRealm *defaultRealm = [RLMRealm defaultRealm];
[defaultRealm transactionWithBlock:^{
[defaultRealm addObject:newDog];
}];
//Rename the dog (Using open/close methods for the transaction)
[defaultRealm beginWriteTransaction];
newDog.name = @"Pluto";
[defaultRealm commitWriteTransaction];
5. Миграция запросов
В базовой реализации, Core Data использует концепцию запросов для извлечения
данных с диска (fetch request). Объект запроса выборки создается, а затем
дополнительные параметры фильтрации и сортировки создаются и добавляются к
объекту запроса
NSManagedObjectContext *context = self.managedObjectContext;
//A fetch request to get all dogs younger than 5 years old, in alphabetical order
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Dog" inManagedObjectContext:context];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < 5"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = entity;
request.predicate = predicate;
request.sortDescriptors = @[sortDescriptor];
NSError *error;
NSArray *dogs = [moc executeFetchRequest:request error:&error];
Сравните, как это все делается в Realm:
RLMResults *dogs = [[Dog objectsWhere:@"age < 5"]
sortedResultsUsingProperty:@"name" ascending:YES];
6. Concurrency
Иногда вам может понадобиться передать объект Realm между потоками. В то время как Core Data
позволяет передавать объекты (managed object) между потоками (хотя это не лучшая практика), в случае
Realm, передача объектов между потоками явно запрещена, и любые попытки сделать это приведут к
исключению (exception).
Самый простой способ обойти это ограничение, использовать GCD чтобы запустить транзакцию
Realm в одном потоке, а получить результат в главном потоке (main thread).
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
//Rename the dog in a background queue
[[RLMRealm defaultRealm] transactionWithBlock:^{
dog.name = @"Peanut Wigglebutt";
}];
//Print the dog's name on the main queue
NSString *uuid = dog.uuid;
dispatch_async(dispatch_get_main_queue(), ^{
Dog *localDog = [Dog objectForPrimaryKey:uuid];
NSLog(@"Dog's name is %@", localDog.name);
});
});

More Related Content

What's hot

Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"IT Event
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»e-Legion
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложенийAndrew Mayorov
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORMMikhail Shamin
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевYandex
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокAndrey Karpov
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)Noveo
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7Technopark
 

What's hot (17)

Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
Артемий Гарин "Выбор лучшего хранилища в Android (cпойлер: Realm)"
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»Владимир Горбенко «Использование блоков в Objective-C»
Владимир Горбенко «Использование блоков в Objective-C»
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORM
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
Продвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр КошелевПродвинутое использование Celery — Александр Кошелев
Продвинутое использование Celery — Александр Кошелев
 
C sharp deep dive
C sharp deep diveC sharp deep dive
C sharp deep dive
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
PHP7 - что ожидать?
PHP7 - что ожидать?PHP7 - что ожидать?
PHP7 - что ожидать?
 
course js day 2
course js day 2course js day 2
course js day 2
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 

Similar to Введение в Realm.io

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.Infinity
 
Rupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev RubyRupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev Rubyemarkine
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Yandex
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSГлеб Тарасов
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grailsguest32215a
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиГлеб Тарасов
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Sergey Platonov
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Alexander Granin
 
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Platonov Sergey
 
хранение данных
хранение данныххранение данных
хранение данныхNoveo
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014Andrey Listochkin
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreDataDmitriy Kuragin
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseCocoaHeads
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4 Dima Dzuba
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in actionYuri Trukhin
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий solit
 

Similar to Введение в Realm.io (20)

Groovy presentation.
Groovy presentation.Groovy presentation.
Groovy presentation.
 
Rupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev RubyRupyru2007 Rastyagaev Ruby
Rupyru2007 Rastyagaev Ruby
 
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
Хранение данных в iPhone. (FMDB, SQL-Persistence, CoreData)
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOSКурсы по мобильной разработке. 1 лекция. Знакомство с iOS
Курсы по мобильной разработке. 1 лекция. Знакомство с iOS
 
Groovy On Grails
Groovy On GrailsGroovy On Grails
Groovy On Grails
 
Школа-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с даннымиШкола-студия разработки для iOS. Лекция 4. Работа с данными
Школа-студия разработки для iOS. Лекция 4. Работа с данными
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++Функционально декларативный дизайн на C++
Функционально декларативный дизайн на C++
 
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"Александр Гранин, "Декларативно-функциональный дизайн на С++11"
Александр Гранин, "Декларативно-функциональный дизайн на С++11"
 
хранение данных
хранение данныххранение данных
хранение данных
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
 
Active Record for CoreData
Active Record for CoreDataActive Record for CoreData
Active Record for CoreData
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Laravel 4 fwdays
Laravel 4 fwdaysLaravel 4 fwdays
Laravel 4 fwdays
 
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Объектно-Ориентированное Программирование на C++, Лекции  3 и 4 Объектно-Ориентированное Программирование на C++, Лекции  3 и 4
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
 
Ecma script 6 in action
Ecma script 6 in actionEcma script 6 in action
Ecma script 6 in action
 
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий Solit 2014, EcmaScript 6 in Action, Трухин Юрий
Solit 2014, EcmaScript 6 in Action, Трухин Юрий
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 

Введение в Realm.io

  • 1. Введение в Realm Realm представляет собой мобильную базу данных: замена для SQLite & Core Data iOS: Приложения, использующие Realm могут работать: iOS7 или выше, OS X 10.9 или выше, WatchKit. Xcode 6.4 или выше. Objective-C, Swift 1.2 & Swift 2.x поддерживаются. Android: JDK версии> = 7. Все Android версии начиная с уровня API 9 (Android 2.3 Gingerbread и выше) поддерживаются.
  • 2. Модели (code-first approach) @class Person; // Dog model @interface Dog : RLMObject @property NSString *name; @property Person *owner; @end RLM_ARRAY_TYPE(Dog) // define RLMArray<Dog> // Person model @interface Person : RLMObject @property NSString *name; @property NSDate *birthdate; @property RLMArray<Dog *><Dog> *dogs; @end RLM_ARRAY_TYPE(Person) // define RLMArray<Person> Модели данных Realm определяются с помощью классов Objective-C со свойствами. Унаследуйте RLMObject или существующий класс модели для создания объектов модели данных Realm. Объекты Realm в основном функционируют как и любые другие объекты Objective-C - вы можете добавить свои собственные методы и протоколы к ним и использовать их, как и любой другой объект. Основные ограничения в том, что вы можете использовать объект только в потоке, в котором он был создан, и вы не можете получить доступ к его ivar для обращения к его свойствам
  • 3. Типы данных Realm поддерживает следующие типы данных: BOOL, INT, NSInteger, float, double, NSString, NSDate (обрезается до секунд), NSData и NSNumber помеченый определенным типом, напр. NSNumber<RLMInt>. Вы можете использовать RLMArray <Object *> <Object> и RLMObject чтобы моделировать такие связи (relations), как to-many и to-one. RLMArrays поддерживают дженерики Objective-C во время компиляции. Вот что означают различные компоненты определения свойства, и почему они полезны: RLMArray: Тип свойства. <Object *>: Специализация дженерика. Это помогает предотвратить использование массива с неправильным типом объекта во время компиляции. <Объект>: Протокол, который поддерживает этот RLMArray. Это позволяет Realm знать, как специализировать схемы этой модели во время выполнения.
  • 4. Отношения (relationships) To-One отношения Для many-to-one or one-to-one отношений, просто определите свойство типа наследника RLMObject // Dog.h @interface Dog : RLMObject // ... other property declarations @property Person *owner; @end
  • 5. To-Many отношения Вы можете определить отношение to-many, используя свойства RLMArray. RLMArray содержат другие объекты одного типа и имеют интерфейс, очень похожий на NSMutableArray. Чтобы добавить свойство dogs в нашей модели Person, которая позволяет установить отношение с несколькими объектами Dog, мы должны сначала определить тип RLMArray <Dog>. Это делается с помощью макроса в нижней части соответствующей модели интерфейса @interface Person : RLMObject @property NSString *name; @property NSDate *birthdate; @property RLMArray<Dog *><Dog> *dogs; @end RLM_ARRAY_TYPE(Dog) // define RLMArray<Person>
  • 6. Миграция приложений с Core Data на Realm 1. Удалить Core Data Framework 2. Удалить код инициализации Core Data В Core Data, изменения объектов производятся в объектах managed object context. Объекты managed object context создаются в рамках persistent store coordinator, который, в свою очередь, связан с managed object model RLMRealm *defaultRealm = [RLMRealm defaultRealm]; 3. Мигрировать файлы моделей Унаследовать от RLMObject вместо NSManagedObject
  • 7. @implementation Dog + (NSString *)primaryKey { return @"uuid"; } + (NSDictionary *)defaultPropertyValues { return @{ @"uuid" : [[NSUUID UUID] UUIDString], @"name" : @"", @"birthdate" : [NSDate date]}; } @end В то время как объекты основных данных, имеют внутреннее свойство NSManagedObjectID чтобы однозначно идентифицировать объекты, Realm оставляет это решение на Вас, как разработчика. В приведенном выше примере, добавляется дополнительное свойство с именем UUID, а затем используется метод [RLMObject PrimaryKey], чтобы пометить его как уникальный идентификатор для этого класса. Тем не менее, если ваши объекты вообще не должны быть однозначно определен, все это может быть пропущено.
  • 8. 4. Миграция операций записи CoreData: //Create a new Dog Dog *newDog = [NSEntityDescription insertNewObjectForEntityForName:@"Dog" inManagedObjectContext:myContext]; newDog.name = @"McGruff"; //Save the new Dog object to disk NSError *saveError = nil; [newDog.managedObjectContext save:&saveError]; //Rename the Dog newDog.name = @"Pluto"; [newDog.managedObjectContext save:&saveError];
  • 9. Realm: //Create the dog object Dog *newDog = [[Dog alloc] init]; newDog.name = @"McGruff"; //Save the new Dog object to disk (Using a block for the transaction) RLMRealm *defaultRealm = [RLMRealm defaultRealm]; [defaultRealm transactionWithBlock:^{ [defaultRealm addObject:newDog]; }]; //Rename the dog (Using open/close methods for the transaction) [defaultRealm beginWriteTransaction]; newDog.name = @"Pluto"; [defaultRealm commitWriteTransaction];
  • 10. 5. Миграция запросов В базовой реализации, Core Data использует концепцию запросов для извлечения данных с диска (fetch request). Объект запроса выборки создается, а затем дополнительные параметры фильтрации и сортировки создаются и добавляются к объекту запроса NSManagedObjectContext *context = self.managedObjectContext; //A fetch request to get all dogs younger than 5 years old, in alphabetical order NSEntityDescription *entity = [NSEntityDescription entityForName:@"Dog" inManagedObjectContext:context]; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < 5"]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = entity; request.predicate = predicate; request.sortDescriptors = @[sortDescriptor]; NSError *error; NSArray *dogs = [moc executeFetchRequest:request error:&error];
  • 11. Сравните, как это все делается в Realm: RLMResults *dogs = [[Dog objectsWhere:@"age < 5"] sortedResultsUsingProperty:@"name" ascending:YES];
  • 12. 6. Concurrency Иногда вам может понадобиться передать объект Realm между потоками. В то время как Core Data позволяет передавать объекты (managed object) между потоками (хотя это не лучшая практика), в случае Realm, передача объектов между потоками явно запрещена, и любые попытки сделать это приведут к исключению (exception). Самый простой способ обойти это ограничение, использовать GCD чтобы запустить транзакцию Realm в одном потоке, а получить результат в главном потоке (main thread). dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{ //Rename the dog in a background queue [[RLMRealm defaultRealm] transactionWithBlock:^{ dog.name = @"Peanut Wigglebutt"; }]; //Print the dog's name on the main queue NSString *uuid = dog.uuid; dispatch_async(dispatch_get_main_queue(), ^{ Dog *localDog = [Dog objectForPrimaryKey:uuid]; NSLog(@"Dog's name is %@", localDog.name); }); });