Realm 數(shù)據(jù)庫在iOS移動端的使用

本人有若干成套學習視頻, 可試看! 可試看! 可試看, 重要的事情說三遍 包含Java, 數(shù)據(jù)結構與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

昨天跟幾個哥們兒吃飯, 大家聊到數(shù)據(jù)庫, 也談到了 FMDB 和 CoreData 的優(yōu)缺點, 突然發(fā)現(xiàn) CoreData 我只記得個大概了, 其實除了 FMDB 和 CoreData, 還有一種常用的數(shù)據(jù)庫是 Realm數(shù)據(jù)庫.

FMDB 操作的是 SQLite 數(shù)據(jù)庫, CoreData 底層其實也是操作 SQLite 數(shù)據(jù)庫, 只是 CoreData 不需要寫 SQL 語句,而且 CoreData 是存儲 OC 對象的.

Realm 也是存儲對象的, 而且用法比較簡單. 也不失為除 FMDB 和 CoreData 的另外一個選擇, 遇到?jīng)]聽過這個的也可以裝個 X

我們今天來用 Realm 數(shù)據(jù)庫做一個簡單的通訊錄

  • 要使用 Realm 數(shù)據(jù)庫, 首先要導入 Realm.framework 這個框架, 從Realm官網(wǎng)上可以下載,我使用的是realm-objc-2.0.3 這個版本, 下載解壓完成后, 將iOS文件夾中的 static文件中的靜態(tài)庫拖到工程中
靜態(tài)庫路徑
  • 然后點擊 Targets, 選擇工程, 點擊 Build Phases, 添加libz.tbd 和 libc++.tbd 兩個庫
添加庫
  • 點擊 plugin 文件中的項目, 運行,然后退出 XCode, 重啟 XCode, 就可以安裝成功插件, 我們就可以利用插件自動生成模型類
安裝插件

安裝成功插件后, 我們 command + N 在新建文件的時候就可以找到這么個東東

Realm Model Object
  • Realm Model Object, 顧名思義, 就是Realm 數(shù)據(jù)庫存儲的模型對象, 你要存儲的數(shù)據(jù)都是繼承自這個類的. 所以我們新建 Realm Model Object 文件時, 就會自動幫我們建立一個.h 和.m 文件
RLMObject 模型文件

這個模型文件的作用還是相當大的, 先按下不表

做通訊錄當然離不開 tableView, 如果說 CoreData 是和 NSFetchedResultsController互相配合, 那么 Realm 就是用到了 RLMResults 這個關鍵類
tableView 的數(shù)據(jù)源就是這么個東東

ViewController.m

    // -------- 初始化數(shù)據(jù)源 --------
- (RLMResults<YFPerson *> *)resultsArray
{
    if (!_resultsArray) {
        
         /* 按照年齡來排序 */
        _resultsArray = [[YFPerson allObjects]sortedResultsUsingProperty:@"age" ascending:YES];
    }
    return _resultsArray;
}

初始化數(shù)據(jù)源數(shù)組的時候還可以設置按照什么排序, 在這里, 我就按照年齡來排序

還有一個關鍵類就是RLMNotificationToken,通知令牌就是當數(shù)據(jù)庫里的元素一發(fā)生變化, 就調(diào)用 block 里的代碼,也非常的方便好用
- (RLMNotificationToken *)notificationToken
{
    
    __weak typeof(self)weakSelf = self;
    if (!_notificationToken) {
        _notificationToken = [self.resultsArray addNotificationBlock:^(RLMResults<YFPerson *> * _Nullable results, RLMCollectionChange * _Nullable change, NSError * _Nullable error) {
            
            if (error) {
                NSLog(@"打開 realm 數(shù)據(jù)庫失敗,%@",error);
                return;
            }
            
             /* 如果數(shù)據(jù)庫的變化為空, 則僅僅刷新 tableView */
            if (!change) {
                [weakSelf.tableView reloadData];
            }
            
             /* 如果變化不為空,則更新 tableView的數(shù)據(jù)源, 并刷新 tableView */
             /* tableView開始更新 */
            [weakSelf.tableView beginUpdates];
             /* tableView 刪除數(shù)據(jù) */
            [weakSelf.tableView deleteRowsAtIndexPaths:[change deletionsInSection:0] withRowAnimation:UITableViewRowAnimationTop];// 因為只有第0組,所以所有的更新都在第0組
            
             /* tableView 添加數(shù)據(jù) */
            [weakSelf.tableView insertRowsAtIndexPaths:[change insertionsInSection:0] withRowAnimation:UITableViewRowAnimationTop];
             /* tableView 刷新數(shù)據(jù) */
            [weakSelf.tableView reloadRowsAtIndexPaths:[change modificationsInSection:0] withRowAnimation:UITableViewRowAnimationTop];
             /* tableView 結束更新 */
            [weakSelf.tableView endUpdates];
        }];
    }
    
     /* 在這里打印一下沙盒的地址, 然后可以看到待會兒可以看到可視化的數(shù)據(jù)庫 */
    NSLog(@"%@",NSHomeDirectory());
    
    return _notificationToken;
}

我們在 block 回調(diào)里面插入數(shù)據(jù),刪除數(shù)據(jù),刷新 tableView, 做這樣一些操作. 當數(shù)據(jù)庫數(shù)據(jù)一發(fā)生變化, 就會做相應的操作, 并刷新 tableView

在上面這個方法, 打印下沙盒地址, 等下用的著
  • 還有一個關鍵類, 就是操作數(shù)據(jù)庫啦, 數(shù)據(jù)庫無外乎四個字: 增,刪,改,查
    今天先講一下增和刪吧, 做了一個增加單個聯(lián)系人,和批量增加聯(lián)系人
1.增加單個聯(lián)系人

RLMRealm 這個單例對象就是創(chuàng)建實例對象并存儲到 Realm 數(shù)據(jù)庫中

- (void)addUniquePerson
{
     /* 這個類是專門開始創(chuàng)建數(shù)據(jù)庫的 */
     /* 開始寫入業(yè)務 */
    [[RLMRealm defaultRealm]beginWriteTransaction];
    
     /* 這個方法是創(chuàng)造一個Realm實例對象,并存儲到 Realm 數(shù)據(jù)庫中 */
    [YFPerson createInRealm:[RLMRealm defaultRealm] withValue:@[[self randomName],@([self randomAge])]];
    
     /* 提交寫入業(yè)務 */
    [[RLMRealm defaultRealm]commitWriteTransaction];
}

很有必要說一下[YFPerson createInRealm:[RLMRealm defaultRealm] withValue:@[[self randomName],@([self randomAge])]];這個方法, 這個方法是基于 KVC 的, 我們在設置 value 的時候可以傳入NSJSONSerialization解析出來的數(shù)組和字典, 當傳入數(shù)組的時候, 所有屬性都必須填寫, 并且要按這個模型對象定義屬性時的順序,否則就會報錯

2.批量增加聯(lián)系人

由于是耗時操作, 我們必須開啟子線程

 /* 添加多個數(shù)據(jù) */
- (void)addManyPersons
{
     /* 添加多個數(shù)據(jù)是耗時操作, 我們重新開啟一個線程來操作 */
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
       
        for (NSUInteger i = 0; i < 5; i++) {
            
             /* 循環(huán)內(nèi)部的邏輯就跟添加單個數(shù)據(jù)一樣了 */
           
            [[RLMRealm defaultRealm]beginWriteTransaction];
            [YFPerson createInRealm:[RLMRealm defaultRealm] withValue:@[[self randomName],@([self randomAge])]];
            [[RLMRealm defaultRealm]commitWriteTransaction];
        }
    });
}
只要增加和批量增加的方法被觸發(fā), 就會立馬刷新到 tableView 上,并且順序是按照年齡的升序來排列的, 這是才初始化數(shù)據(jù)源數(shù)組的時候設置好的
  • 在側滑刪除中, 我們做一個刪除數(shù)據(jù)的功能, 其實跟添加數(shù)據(jù)差不多的
    // -------- 側滑打開的方法 --------
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
     /* 刪除數(shù)據(jù),其實方法和添加數(shù)據(jù)是差不多的 */
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        [[RLMRealm defaultRealm]beginWriteTransaction];
        [[RLMRealm defaultRealm]deleteObject:self.resultsArray[indexPath.row]];
        [[RLMRealm defaultRealm]commitWriteTransaction];
    }
}

整個效果做出來其實是這樣的


效果圖
那我們要看數(shù)據(jù)庫在什么位置怎么辦呢?
  • 首先裝一個


    Realm 瀏覽器
  • 在 APP Store 里下載

  • 然后將之前打印出的沙盒地址來一個"前往"

  • 數(shù)據(jù)庫存儲在 Documents 文件夾中


    數(shù)據(jù)庫地址
  • 用Realm 瀏覽器打開后是這個樣子滴, 你存儲的對象都在里面


    Realm 數(shù)據(jù)庫

本文源碼鏈接地址
Realm 數(shù)據(jù)庫也是很博大精深的,大家一起探討,感謝支持!

PS. 本人有若干成套學習視頻, 包含Java, 數(shù)據(jù)結構與算法, iOS, 安卓, python, flutter等等, 如有需要, 聯(lián)系微信tsaievan.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邦危,一起剝皮案震驚了整個濱河市芜繁,隨后出現(xiàn)的幾起案子矗烛,更是在濱河造成了極大的恐慌牡借,老刑警劉巖页屠,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件济榨,死亡現(xiàn)場離奇詭異征绎,居然都是意外死亡穷当,警方通過查閱死者的電腦和手機获洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門阱表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事最爬∩婺伲” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵爱致,是天一觀的道長烤送。 經(jīng)常有香客問我,道長糠悯,這世上最難降的妖魔是什么帮坚? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮互艾,結果婚禮上试和,老公的妹妹穿的比我還像新娘。我一直安慰自己纫普,他們只是感情好灰署,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著局嘁,像睡著了一般溉箕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悦昵,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天肴茄,我揣著相機與錄音,去河邊找鬼但指。 笑死寡痰,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棋凳。 我是一名探鬼主播拦坠,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剩岳!你這毒婦竟也來了贞滨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤拍棕,失蹤者是張志新(化名)和其女友劉穎晓铆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绰播,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡骄噪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蠢箩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链蕊。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡事甜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滔韵,到底是詐尸還是另有隱情讳侨,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布奏属,位于F島的核電站,受9級特大地震影響潮峦,放射性物質(zhì)發(fā)生泄漏囱皿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一忱嘹、第九天 我趴在偏房一處隱蔽的房頂上張望嘱腥。 院中可真熱鬧,春花似錦拘悦、人聲如沸齿兔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分苇。三九已至,卻和暖如春屁桑,著一層夾襖步出監(jiān)牢的瞬間医寿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工蘑斧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靖秩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓竖瘾,卻偏偏與公主長得像沟突,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捕传,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容