2016-05-23 65 views
2

我想從下面的模型進行Realm.IO遷移過程中包含零,而不是零:可選int屬性遷移

public class RealmBuddy: Object { 
    dynamic var id = 0 
    let contactId = RealmOptional<Int>() 
    dynamic var name = "" 
    let topics = List<RealmTopic>() 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

以下幾點:

public class RealmBuddy: Object { 
    dynamic var id = 0 
    dynamic var contactId: String? = nil 
    dynamic var name = "" 
    let topics = List<RealmTopic>() 

    override public static func primaryKey() -> String? { 
     return "id" 
    } 
} 

正如你所看到的,單個更改處於contactId類型中:可選Int應該轉換爲可選String。我實現這樣的:

if (oldSchemaVersion < 1) { 
    migration.enumerate(RealmBuddy.className()) { oldObject, newObject in 
     if let contactId = oldObject!["contactId"] as? Int { 
      newObject!["contactId"] = "\(contactId)" 
     } 
    } 
} 

然而,我發現,在遷移之後我的實體,其沒有使用ContactID(即nil值)現在已經使用ContactID等於「0」字符串。看起來oldObject![「contactId」]返回0而不是nil。

我還沒有找到任何有關如何執行這個簡單的任務的信息或例子,所以我不知道如果我正確地檢索/施放值(也試圖投到RealmOptional<Int>),所以我決定在這裏問一下在github上提交問題之前。 這是一個錯誤或預期的行爲?如果是預期的行爲,如何正確地獲得價值?

PS:我的項目是開源的,因爲我是新來的iOS和發展它自身的教育,所以我把它推到一個repo,其中問題可以很容易地複製(請注意,這是在migration_issue分支)。我還使用現有的.realm文件製作了unit test,該文件在測試期間遷移到新的模式。希望這會有所幫助。

PPS:我試過0.102.1和0.103.1版本的庫。

PPPS:有人提到Realm Browser在我的sample.realm文件中沒有顯示任何帶有零值的contactId。我認爲這只是Realm瀏覽器問題,所以我在另一個分支中創建了另一個unit test以證明舊數據庫具有零值。

回答

0

這是一個錯誤。見https://github.com/realm/realm-cocoa/pull/3643。固定在0.103.2。標量類型的

可選性能得到錯誤的Objective-C 類型代碼,導致動態存取服用非可選 代碼路徑。這導致零值返回爲0.

0

當我在領域瀏覽器中打開default-v0.realm時,我看不到有空的contactId的任何行。如果你期待有一個,那麼問題出現在最初填充領域的代碼中,而不是遷移代碼。

+0

我也有這個想法,當我試圖打開Realm瀏覽器中的數據庫。但是,當我通過代碼加載給定的.realm文件時,*有*無值 - 名稱爲「Roman Petrenko」的記錄具有它。其他聯繫人(「凱特貝爾」)有contactId == 1.所以我認爲Realm瀏覽器不能顯示零值。 –

+0

我更新了我的答案和回購以證明default-v0.realm中存在零值 –