realm可以說對開發(fā)者非常友好,基礎的東西看兩遍中文文檔就了解了,不做搬運工了。文章說說文檔里面的注意點,和文檔之外的實用的東西。希望你們用的上。
realm基礎:
github地址:https://github.com/realm/realm-cocoa
中文文檔地址:https://realm.io/cn/docs/objc/latest/
realm進階:
- 數(shù)據(jù)庫遷移
// 數(shù)據(jù)遷移位置最好在數(shù)據(jù)庫初始化的時候,或者說在使用realm數(shù)據(jù)庫之前,appDelegate也行
// * 很重要 * ,數(shù)據(jù)庫遷移注意數(shù)據(jù)庫名稱,不要和默認數(shù)據(jù)庫混淆(這里注意除非使用默認配置數(shù)據(jù)庫,否則任何操作都帶上config比較穩(wěn))
// 有點雞肋,正式環(huán)境不能讓你隨意刪除舊數(shù)據(jù)
config.deleteRealmIfMigrationNeeded = YES;
// 數(shù)據(jù)庫方法,sdk提供了幾個遷移的方法可以自己看看
// 2者只能取其一,config.deleteRealmIfMigrationNeeded = YES; 下面的block就不會走了。
config.migrationBlock = ^(RLMMigration *migration , uint64_t oldSchemaVersion) {};
- 數(shù)據(jù)冗余處理方式
// realm暫時不支持循環(huán)刪除子節(jié)點(RLMObject)里面的數(shù)據(jù),需要自己手動刪除
// addOrUpdata:(必需有主鍵,subModel可以沒有主鍵)
// 1子節(jié)點有主鍵,更新的時候不用管,刪除的時候循環(huán)刪除子節(jié)點,極端情況(極端情況:多個model公用一個主鍵相同的子節(jié)點,刪除一個submodel,導致其他用這個submodel的鏈接也沒有了)
// 2子節(jié)點無主鍵,更新的時候要先刪除老子節(jié)點,刪除的時候循環(huán)刪除子節(jié)點 (沒有上面公用同一個子節(jié)點的問題)
- 數(shù)據(jù)結果集分頁
//realm不支持分頁,需要自己手動刪除,他們認為數(shù)據(jù)查詢很快把整個結果集給你,你自己處理就好
// 分頁查詢數(shù)據(jù)
- (NSArray *)arrayWithPageNum:(NSInteger)pageNum pageSize:(NSInteger)pageSize results:(RLMResults *)results {
NSMutableArray *pageArray = [NSMutableArray array];
for (NSInteger i = pageNum * pageSize; i < pageNum * pageSize + pageSize; i++) {
if (i >= results.count) break;
id object = results[i];
[pageArray addObject:object];
}
return pageArray;
}
- 數(shù)據(jù)結果集排序
- 數(shù)據(jù)庫建表
- 數(shù)據(jù)操作通知回調(diào)
// api提供了五種之多,選擇集合通知和對象通知【刪除和修改】處理就可以
- 數(shù)據(jù)庫打開和關閉數(shù)據(jù)庫
異步數(shù)據(jù)庫
遠程數(shù)據(jù)庫
壓縮數(shù)據(jù)庫
等等等等其他高級功能。
realm注意事項:
- 指定數(shù)據(jù)庫config,因為不指定就成默認數(shù)據(jù)庫了。
- 異步記得要從新生成realm對象
- 刪除更新對象什么的,先去數(shù)據(jù)庫查詢,找到了再操作。
- 代碼入侵性考慮