IOS-Realm 数据库在移动端的使用

来源:互联网 发布:无线充电贴片 知乎 编辑:程序博客网 时间:2024/05/22 07:08

用 Realm 数据库做一个简单的通讯录

1.要使用 Realm 数据库, 首先要导入 Realm.framework 这个框架, 从Realm官网上可以下载,我使用的是realm-objc-2.0.3 这个版本, 下载解压完成后, 将iOS文件夹中的 static文件中的静态库拖到工程中.

这里写图片描述

2.然后点击 Targets, 选择工程, 点击 Build Phases, 添加libz.tbd 和 libc++.tbd 两个库.

这里写图片描述

3.点击 plugin 文件中的项目, 运行,然后退出 XCode, 重启 XCode, 就可以安装成功插件, 我们就可以利用插件自动生成模型类.

这里写图片描述

4.安装成功插件后, 我们 command + N 在新建文件的时候就可以找到这么个东东.

这里写图片描述

5.Realm Model Object, 顾名思义, 就是Realm 数据库存储的模型对象, 你要存储的数据都是继承自这个类的. 所以我们新建 Realm Model Object 文件时, 就会自动帮我们建立一个.h 和.m 文件.

这里写图片描述

这个模型文件的作用还是相当大的, 先按下不表

做通讯录当然离不开 tableView, 如果说 CoreData 是和 NSFetchedResultsController互相配合, 那么 Realm 就是用到了 RLMResults 这个关键类
tableView 的数据源就是这个.

    // -------- 初始化数据源 --------- (RLMResults<YFPerson *> *)resultsArray{    if (!_resultsArray) {         /* 按照年龄来排序 */        _resultsArray = [[YFPerson allObjects]sortedResultsUsingProperty:@"age" ascending:YES];    }    return _resultsArray;}

初始化数据源数组的时候还可以设置按照什么排序, 在这里, 我就按照年龄来排序。

还有一个关键类就是RLMNotificationToken,通知令牌就是当数据库里的元素一发生变化, 就调用 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 数据库失败,%@",error);                return;            }             /* 如果数据库的变化为空, 则仅仅刷新 tableView */            if (!change) {                [weakSelf.tableView reloadData];            }             /* 如果变化不为空,则更新 tableView的数据源, 并刷新 tableView */             /* tableView开始更新 */            [weakSelf.tableView beginUpdates];             /* tableView 删除数据 */            [weakSelf.tableView deleteRowsAtIndexPaths:[change deletionsInSection:0] withRowAnimation:UITableViewRowAnimationTop];// 因为只有第0组,所以所有的更新都在第0组             /* tableView 添加数据 */            [weakSelf.tableView insertRowsAtIndexPaths:[change insertionsInSection:0] withRowAnimation:UITableViewRowAnimationTop];             /* tableView 刷新数据 */            [weakSelf.tableView reloadRowsAtIndexPaths:[change modificationsInSection:0] withRowAnimation:UITableViewRowAnimationTop];             /* tableView 结束更新 */            [weakSelf.tableView endUpdates];        }];    }     /* 在这里打印一下沙盒的地址, 然后可以看到待会儿可以看到可视化的数据库 */    NSLog(@"%@",NSHomeDirectory());    return _notificationToken;}

我们在 block 回调里面插入数据,删除数据,刷新 tableView, 做这样一些操作. 当数据库数据一发生变化, 就会做相应的操作, 并刷新 tableView.

在上面这个方法, 打印下沙盒地址, 等下用的着

还有一个关键类, 就是操作数据库啦, 数据库无外乎四个字: 增,删,改,查
今天先讲一下增和删吧, 做了一个增加单个联系人,和批量增加联系人

1.增加单个联系人
RLMRealm 这个单例对象就是创建实例对象并存储到 Realm 数据库中

- (void)addUniquePerson{     /* 这个类是专门开始创建数据库的 */     /* 开始写入业务 */    [[RLMRealm defaultRealm]beginWriteTransaction];     /* 这个方法是创造一个Realm实例对象,并存储到 Realm 数据库中 */    [YFPerson createInRealm:[RLMRealm defaultRealm] withValue:@[[self randomName],@([self randomAge])]];     /* 提交写入业务 */    [[RLMRealm defaultRealm]commitWriteTransaction];}

很有必要说一下[YFPerson createInRealm:[RLMRealm defaultRealm] withValue:@[[self randomName],@([self randomAge])]];这个方法, 这个方法是基于 KVC 的, 我们在设置 value 的时候可以传入NSJSONSerialization解析出来的数组和字典, 当传入数组的时候, 所有属性都必须填写, 并且要按这个模型对象定义属性时的顺序,否则就会报错.

2.批量增加联系人
由于是耗时操作, 我们必须开启子线程

/* 添加多个数据 */- (void)addManyPersons{     /* 添加多个数据是耗时操作, 我们重新开启一个线程来操作 */    dispatch_async(dispatch_get_global_queue(0, 0), ^{        for (NSUInteger i = 0; i < 5; i++) {             /* 循环内部的逻辑就跟添加单个数据一样了 */            [[RLMRealm defaultRealm]beginWriteTransaction];            [YFPerson createInRealm:[RLMRealm defaultRealm] withValue:@[[self randomName],@([self randomAge])]];            [[RLMRealm defaultRealm]commitWriteTransaction];        }    });}

只要增加和批量增加的方法被触发, 就会立马刷新到 tableView 上,并且顺序是按照年龄的升序来排列的, 这是才初始化数据源数组的时候设置好的

在侧滑删除中, 我们做一个删除数据的功能, 其实跟添加数据差不多的

    // -------- 侧滑打开的方法 --------- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{     /* 删除数据,其实方法和添加数据是差不多的 */    if (editingStyle == UITableViewCellEditingStyleDelete) {        [[RLMRealm defaultRealm]beginWriteTransaction];        [[RLMRealm defaultRealm]deleteObject:self.resultsArray[indexPath.row]];        [[RLMRealm defaultRealm]commitWriteTransaction];    }}

整个效果做出来其实是这样的:
这里写图片描述

        参考链接:http://www.jianshu.com/p/4f3ebe815853
0 0
原创粉丝点击