項目中用到了Realm做數(shù)據(jù)存儲,在版本迭代時對存儲的用戶信息新增了一個屬性,結(jié)果導(dǎo)致項目崩潰。經(jīng)查閱發(fā)現(xiàn)本有做數(shù)據(jù)庫遷移操作,現(xiàn)將Realm數(shù)據(jù)庫遷移的方法貼出來,希望有用的同學(xué)可以拿走。
當(dāng)RLMObject屬性增加、刪除、更改時,原數(shù)據(jù)庫需要進行遷移處理,在
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;方法里寫入如下對應(yīng)操作的代碼
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
config.schemaVersion =2;
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion){
// enumerateObjects:block: 遍歷了存儲在 Realm 文件中的每一個“Person”對象
[migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) {
if(oldSchemaVersion <1) {// 只有當(dāng) Realm 數(shù)據(jù)庫的架構(gòu)版本為 0 的時候,才添加 “fullName” 屬性
newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@", oldObject[@"firstName"], oldObject[@"lastName"]];
}
if(oldSchemaVersion <2) {// 只有當(dāng) Realm 數(shù)據(jù)庫的架構(gòu)版本為 0 或者 1 的時候,才添加“email”屬性
newObject[@"email"] = @"";
}
if(oldSchemaVersion <3) {// 替換屬性名
// 重命名操作應(yīng)該在調(diào)用 `enumerateObjects:` 之外完成
[migration renamePropertyForClass:Person.className oldName:@"yearsSinceBirth"newName:@"age"];
}
}];
[RLMRealmConfiguration setDefaultConfiguration:config];