2015-11-07 81 views
0

我最近將我的Realm庫從0.92(我認爲)升級到0.96.2,但是在「可選」屬性的新支持方面遇到了一些麻煩。我還需要首次進行移徙,這也是一件複雜的事情。領域遷移和可選屬性

到單個字段添加到數據類型中的一種需要新的方案,所以我編寫了一個遷移是建立在現有的對象這個新屬性:

RLMRealmConfiguration* config = [RLMRealmConfiguration defaultConfiguration]; 
config.schemaVersion = 1; 
config.migrationBlock = ^(RLMMigration* migration, uint64_t oldSchemaVersion) 
{ 
    [migration enumerateObjects:Foo.className 
          block:^(RLMObject* oldObject, RLMObject* newObject) { 
           if (oldSchemaVersion < 1) 
           { 
           newObject[@"user"] = @""; 
           } 
          }]; 
}; 
[RLMRealmConfiguration setDefaultConfiguration:config]; 

然而,一旦代碼試圖打開一個境界,我得到一個錯誤信息有關可選屬性類型:

'Migration is required for object type 'Person' due to the following errors: 
- Property 'name' has been made optional. 
- Property ‘company’ has been made optional. 
- Property 'title' has been made optional. 
- Property 'phone' has been made optional. 
- Property 'email' has been made optional. 
- Property 'homeAddress' has been made optional.' 

問題#1 - 由於模型是從「必要」的屬性將「可選」,還有的保證是一個值ALR對現有物體存在;所以我很努力地看到爲什麼遷移是要求

問題2 - 我還是喜歡遷移的對象,無出的屬性,如果該字符串是空的,所以我編寫了一個遷移:

RLMRealmConfiguration* config = [RLMRealmConfiguration defaultConfiguration]; 
config.schemaVersion = 1; 
config.migrationBlock = ^(RLMMigration* migration, uint64_t oldSchemaVersion) 
{ 
    NSLog(@"RUNNING REALM MIGRATION"); 

    // ...basic migration of adding a new property (above) 

    [migration enumerateObjects:Person.className 
          block:^(RLMObject* oldObject, RLMObject* newObject) { 
           if (oldSchemaVersion < 1) 
           { 
            if ([oldObject[@"name"] length] == 0) 
             newObject[@"name"] = nil; 
            else 
             newObject[@"name"] = oldObject[@"name"]; 

            // … repeat for other properties 
       } 
          }]; 
}; 
[RLMRealmConfiguration setDefaultConfiguration:config]; 

然而,遷移似乎沒有運行; if (oldSchemaVersion < 1)塊內的斷點不會被打中,並且"RUNNING REALM MIGRATION"消息不會打印。

外塊 - 建立RLMRealmConfiguration - 被擊中裏面application:didFinishLaunchingWithOptions:

回答

0

這個問題似乎是我設置了默認RLMRealmConfiguration與我的遷移信息,但[RLMRealm realmWithPath:]忽略默認配置。

而不是使用realmWithPath:的,可以複製的默認配置(包括您migrationBlockschemaVersion),設置path財產,並把它傳遞給[RLMRealm realmWithConfiguration:error:]

RLMRealmConfiguration* config = [RLMRealmConfiguration defaultConfiguration]; 
config.path = file; 

NSError* error = nil;      
RLMRealm* realm = [RLMRealm realmWithConfiguration:config 
              error:&error]; 
1

問題#1 默認情況下,所有屬性被指定0.96之前版本的境界「需要」。在0.96中,默認情況下它們被標記爲「可選」。因此,由於新底層文件格式的變化以適應此(相對不重要的更改),因此需要進行遷移以將這些先前所需的屬性轉換爲可選項。

如果要根據需要保留這些屬性,可以通過覆蓋[RLMObject requiredProperties]方法來定義此屬性。

問題2 嗯......看示例代碼,它建議您封裝if (oldSchemaVersion < 1)條件塊內枚舉聲明,而不是周圍的其他方式。這可能會導致事情不按順序發生。你有嘗試過交換嗎?

讓我知道這是否有幫助! :)

+0

謝謝,我沒有注意到,我會翻轉枚舉和條件塊。我仍然有同樣的問題:'config。migrationBlock'似乎並沒有被執行。 – Chris

+0

需要進行遷移才能將這些以前需要的屬性轉換爲可選屬性。 - 這個怎麼做? - 我試過了,只需要一次遷移,即使它是空的。 –