2017-01-09 116 views
0

我有一個模型有兩個對象:SFCHChatSFCHMessages它們有一對多的關係。RLMArray到RLMLinkingObjects遷移

由於從境界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.messagesSFCHMessage.chat 。下面是這些對象的代碼的diff:

### 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"], 
+    }; 
+} 
+ 

總結我遷移上境界對象到一個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]時間,遷移將運行,你的文件將被升級。