2017-01-09 6 views
0

У меня есть модель с двумя объектами: SFCHChat и SFCHMessages, которые имеют отношения «один ко многим».RLMArray to RLMLinkingObjects migration

Благодаря модернизации от Realm 0,98 до 2,0 теперь я получаю следующее исключение в производстве:

Migration is required due to the following errors: - Property 'SFCHChat.chatId' has been made optional. - Property 'SFCHChat.lastReadedMessageId' has been made optional. - Property 'SFCHMessage.chat' has been added. - Property 'SFCHMessage.messageId' has been made optional. - Property 'SFCHMessage.chatId' has been made optional. - Property 'SFCHMessage.userId' has been made optional. - Property 'SFCHMessage.message' has been made optional. - Property 'SFCHUser.initials' has been made optional. - Property 'SFCHUser.userId' has been made optional. - Property 'SFCHChat.messages' has been removed. 

Итак, я добавил опции к + (NSArray *)requiredProperties, но не ясно, как идти о SFCHChat.messages и SFCHMessage.chat , Вот код дифф для этих объектов:

### SFCHMessage.h 
[email protected] (readonly) SFCHChat *chat; 
[email protected] SFCHChat *chat; 

### SFCHMessage.m 
-- (SFCHChat *)chat 
-{ 
- return [[self linkingObjectsOfClass:@"SFCHChat" forProperty:@"messages"] firstObject]; 
-} 
- 

### SFCHChat.h 

[email protected] RLMArray<SFCHMessage> *messages; 
[email protected] (readonly) RLMLinkingObjects *messages; 

### SFCHChat.m 

++ (NSDictionary *)linkingObjectsProperties { 
+ return @{ 
+    @"messages": [RLMPropertyDescriptor descriptorWithClass:SFCHMessage.class propertyName:@"chat"], 
+    }; 
+} 
+ 

Резюмируя я мигрировал массив на Realm объектов в RLMLinkingObjects собственности, linkingObjectsOfClass стал устаревшими. Итак, вместо добавления SFCHMessage объектов на SFCHChat.messages RLMArray Я добавил chat собственности на каждые SFCHMessage, а также ссылку из них RLMLinkingObjects.

Похоже, что изменение на (readonly) рассматривается как удаление свойств в области, тогда как удаление его рассматривается как добавление свойств. Действительно ли мне нужен блок миграции для моего дела? Как я могу выполнить эту миграцию?

ответ

1

Да, я бы сказал, что было бы уместно, чтобы вы столкнулись с схемой вашего Царства и выполнили миграцию.

Хотя вы можете смягчить, когда Realm добавила дополнительные значения ко всем свойствам, просто явно сделав их необходимыми, когда дело доходит до добавления или удаления свойств, для этого просто потребуется миграция.

Если нет данных в свойствах, которые будут потеряны при миграции, если вы не решите сохранить их, выполнение миграции Realm будет так же просто, как просто добавить пустой блок.

RLMRealmConfiguration *configuration = [RLMRealmConfiguration defaultConfiguration]; 
configuration.schemaVersion = 1; //Must be incremented by 1 each time the schema is changed. 
configuration.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) { }; 
[RLMRealmConfiguration setDefaultConfiguration:configuration]; 

Это сделает его, что в следующий раз, когда вы звоните [RLMRealm defaultRealm], миграция будет работать и ваш файл будет обновлен.