-
realm介绍:
-
realm的学习笔记 http://www.jianshu.com/p/95fd23c4ec5f
-
Realm是一个移动端的数据库,Realm是SQLite和CoreData的替代者。它可以节省你成千上万行代码和数周的工作,并且让你精巧的制作出令人惊叹的用户体验。简单易用,快速持久。
准备工作
- 1.安装realm模版插件(使用模版创建对象模型):下载realm官网oc的demo(https://realm.io/docs/objc/latest/), 编译plugin下的 RealmPlugin.xcodeproj项目,编译成功 插件就安装成功了,然后重启就可以使用。
- 2.安装成功之后创建项目,并手动导入框架或者使用cocopod导入(在刚才官网中有手动导入的步骤);
- 3.在苹果商店下载一个Realm Browser 的软件,查看realm数据库文件;
- 准备工作完成;
使用流程
- 1.导入头文件#import < Realm/Realm.h >.
- 2.创建类,使用realm模版进行创建(模版插件安装成功就会看到realm模版),继承于RLMObject.如图:
@interface BLEBook : RLMObject
@property NSString *name;
@property NSInteger price;
@end
//设置主键
@implementation BLEPerson
+ (NSString *)primaryKey {
return @"id";
}
@end
- 3.在类中生成数据模型.
- 4.在需要的地方创建实例,使用Realm方法调用.
基本语法
插入
插入方式1:
//这种插入:有相同的主键会崩溃
//初始化book的三种方式
方式1:
BLEBook *book = [[BLEBook alloc]init];
book.name = @"C++语言";
book.price = 100;
方式2:
BLEBook *dicBook = [[BLEBook alloc]initWithValue:@{@"name":@"数据库",@"price":@50}];
方式3:
BLEBook *arrBook = [[BLEBook alloc]initWithValue:@[@"C语言",@25]];
//在处理事务的时候做添加book
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm addObject:book];
[realm addObject:dicBook];
[realm addObject:arrBook];
[realm commitWriteTransaction];
插入方式2:
这种插入:如果有相同主键会做修改 负责就添加
BLEPerson *author = [[BLEPerson alloc]init];
author.id = 101;
author.name = @"并er";
[[RLMRealm defaultRealm]beginWriteTransaction];
[BLEPerson createOrUpdateInRealm:[RLMRealm defaultRealm] withValue:author];
[[RLMRealm defaultRealm]commitWriteTransaction];
删除
[[RLMRealm defaultRealm]beginWriteTransaction];
RLMResults *result = [BLEBook allObjects];
[[RLMRealm defaultRealm]deleteObject:result.lastObject];
[[RLMRealm defaultRealm]commitWriteTransaction];
修改
[[RLMRealm defaultRealm]beginWriteTransaction];
RLMResults *result = [BLEBook allObjects];
BLEBook *firstBook = [result objectAtIndex:0];
firstBook.price = 400;
BLEBook *book = result.lastObject;
book.price = 100;
[[RLMRealm defaultRealm]commitWriteTransaction];
查询
//1.使用断言字段查询
RLMResults *result = [BLEBook objectsWhere:@"name BEGINSWITH 'C'"];
NSLog(@"%@",result);
//2.使用谓词字段查询
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"price == '50'"];
RLMResults *result = [BLEBook objectsWithPredicate:predicate];
NSLog(@"%@",result);
排序
RLMResults *sortBook = [[BLEBook allObjects]sortedResultsUsingProperty:@"name" ascending:NO];
NSLog(@"%@",sortBook);
添加通知
Realm有一个注册通知的方法:addNotificationBlock:
作用:监听数据库数据的改变,如果监听到数据库数据改变,就会执行通知回调。刷新界面更新界面数据。
实例:
这是我在A控制器引用了数据库数据,尝试使用注册通知监听数据的改变。
//必须强引用改通知(防止释放)
@property (nonatomic, strong)RLMNotificationToken *token;
self.token = [[CHRealm defaultRealm]addNotificationBlock:^(NSString * _Nonnull notification, RLMRealm * _Nonnull realm) {
//监听到数据库数据改变后,就会执行此回调方法
[self.tableView reloadData];
}];
注意:在控制器释放的时候要释放监听(通知的基本用法)
- (void)dealloc {
[self.token stop];
}
此方法用起来简直就是爽爆了,小伙伴们你怎么看 赶快试一下吧。
数据迁移
我们都知道在开发过程中,数据的模型有时会随着开发的递进,需要做适当的添加或删除部分属性,这就需要用到数据的迁移了。因为当使用realm进行了数据存储后,必须经过数据的迁移才能修改对应的数据库。实际上就是升级存储在沙盒里的数据库版本。具体代码实现(didFinishLaunchingWithOptions中实现)
//数据迁移
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
// 设置新的架构版本。这个版本号必须高于之前所用的版本号(如果您之前从未设置过架构版本,那么这个版本号设置为 0)
config.schemaVersion = 2;
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
// 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0
if (oldSchemaVersion < 1) {
// 什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构
CHLog(@"数据迁移");
}
};
[RLMRealmConfiguration setDefaultConfiguration:config];
[RLMRealm defaultRealm];
//每次修改了数据的模型的时候 就需改一次schemaVersion属性(版本号 注意:版本号不能低于上一次的版本)
realm存储路径修改
realm默认存储在document文件中。
直接上代码:
- (RLMRealm *)instanceRealm {
//默认配置(此时存储路径指向document)
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
//修改路径(删除后两个路径path)
config.fileURL = [[config.fileURL URLByDeletingLastPathComponent]URLByDeletingLastPathComponent];
//修改路径 (添加路径path指向library的caches)
config.fileURL = [[[[config.fileURL URLByAppendingPathComponent:@"Library" isDirectory:YES] URLByAppendingPathComponent:@"Caches" isDirectory:YES] URLByAppendingPathComponent:@"chronos"] URLByAppendingPathExtension:@"realm"];
NSError *error = nil;
//创建realm
RLMRealm *realm = [RLMRealm realmWithConfiguration:config error:&error];
if (error) {
NSLog(@"%ld",error.code);
}
return realm;
}
运行结束查看项目的document文件路径 使用realm brower查看.realm 文件 实例:
注意:
具体的可以在官网查看。
因此设置可空的数字属性必须是RLMInt、RLMFloat、RLMDouble或者RLMBool其中一个类型。
网友评论
739118969私聊下吧
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"price = 50"];
这个应该是
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"price == '50' "];
才对