2016-08-08 33 views
1

所以我有境界對象領域迅速變化的PrimaryKey

class RegistrationPlateDB: RLMObject { 

    dynamic var registrationPlate : String = "" 
    dynamic var user : String = "" 

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

,並想將其更改爲

class RegistrationPlateDB: Object { 

    dynamic var plateID : Int = -1 
    dynamic var registrationPlate : String = "" 
    dynamic var name : String = "" 
    dynamic var user : String = "" 


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

所以我寫了一個遷移

migration.enumerate(RegistrationPlateDB.className()) { oldObject, newObject in 

     newObject!["name"] = "" 
     newObject!["user"] = "" 
     newObject!["registrationPlate"] = "" 
     newObject!["plateID"] = -1 
     newObject!["primaryKeyProperty"] = "plateID"; 
} 

,但我得到一個錯誤可能是因爲primaryKey的變化,因爲如果我離開那條線,它可以工作,但主鍵不會改變。

有人可以給我任何想法如何改變primaryKey。

編輯:第一個目的是爲Objective-C的境界書面

EDIT2:或者,如果有人會知道我怎麼能做出plateID自動增量

回答

3

克己從這裏境界。您不需要嘗試更改遷移塊中的主鍵。

我們總是自動將模式更新爲最新版本,並且您必須在遷移模塊中處理的唯一事情是調整數據以適應數據(例如,如果重命名屬性,則必須從數據庫中複製數據舊的財產到遷移塊中的新財產)。因此newObject!["primaryKeyProperty"] = "plateID";是不需要的。

我覺得你的遷移塊應該是這樣的:

migration.enumerate(RegistrationPlateDB.className()) { oldObject, newObject in 
    newObject!["user"] = oldObject!["user"] 
    newObject!["registrationPlate"] = oldObject!["registrationPlate"] 
    newObject!["plateID"] = Int(oldObject!["registrationPlate"] as! String) 
} 

如果您想序列號分配給plateID,例如:

var plateID = 0 
migration.enumerate(RegistrationPlateDB.className()) { oldObject, newObject in 
    newObject!["user"] = oldObject!["user"] 
    newObject!["plateID"] = plateID 
    plateID += 1 
} 
+0

我理解沒有必要的想法爲了在遷移中聲明新的主鍵,所以我嘗試了你的建議,但我認爲現在的問題是oldObject![「registrationPlate」]是一個詞,所以我不認爲這可能會陷入低谷。 所以,如果你能告訴我是否有任何方法將plateID設置爲遷移中的自動​​增量? – schmru

+0

編輯:或者如果有一種方法來重命名對象,所以我可以創建一個新的一箇舊的,然後重新創建一個複製數據。 – schmru

+1

@schmru我更新了答案。領域不支持自動增量功能。所以你應該自己實現這個功能。如果你不需要序列號,使用'NSUUID'是最簡單的方法。如果你想用主鍵排序,你可以使用'NSDate()'來代替。 –