摘要
Realm是一个跨平台的移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及Android。专门为移动应用的数据持久化而生,相比Core Data 和 SQLite冗余、繁杂的知识更加易学上手,可以极大的减少学习的成本。
使用背景
之前也是在一篇技术文章上看到Realm的介绍,感觉是挺好的,但是没有具体去用,直到有自己的一个业余项目,这个项目的业务场景是这样的,这是一个用于门禁监控的一款应用,我们的后台什么的都是用的第三方的服务,所以数据什么的基本上是我们在本地处理.我第一时间就想到了Realm
参考网站:https://realm.io
使用流程
1.创建类,继承于RLMObject.
2.导入头文件#import < Realm/Realm.h >.
3.在类中生成数据模型.
4.在需要的地方创建实例,使用Realm方法调用.
数据模型结构如下
@interface DeviceListModel : RLMObject
@property (nonatomic,copy)NSString *did; //设备云端身份标识 DID
@property (nonatomic,copy)NSString *productKey; // NSString类型。设备的产品类型识别码
@property (nonatomic,copy)NSString *productName;//设备的产品名称
@property (nonatomic,strong)RLMArray*ezmodels;//绑定的摄像头模型
@end
自定义主键
由于项目需要每一个控制面板可以绑定多个摄像头的应用场景,由此我想到用面板的唯一标识(英文、数字)作为主键(比起我之前用过的CoreModel主键更胜一筹,CoreModel主键只能是Int~0~,在此处完全不适用)
@implementation DeviceListModel
+ (NSString *)primaryKey {
return @"did";
}
@end
数据库写入操作
数据库的写入操作十分简单,只需要把我们的Model实例化,赋值,调用Realm提供的方法,全自动建表写入。
devModel = [[DeviceListModel alloc] init];
devModel.did = dev.did;
devModel.productKey = dev.productKey;
devModel.productName = dev.productName;
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[DeviceListModel createOrUpdateInRealm:realm withValue:devModel];
[realm commitWriteTransaction];
数据库查询与删除操作
谓词对我们iOS开发人员来说再熟悉不过了,在Realm里同样适用,我们只需要传递相应地NSPredicate实例,谓词字符串,谓词格式字符串,就可以获取你想要的RLMObjects实例。就和NSObject一样的。
NSString *whereGz = [NSString stringWithFormat:@"did = '%@' ",dev.did];
RLMResults *allGzdevice = [DeviceListModel objectsWhere:whereGz];
if (allGzdevice.count) {
RLMResults *tempArra1 = [DeviceListModel allObjects];
DeviceListModel *devModel = allGzdevice[0];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[devModel.ezmodels removeAllObjects];
[realm commitWriteTransaction];
RLMResults *tempArra = [DeviceListModel allObjects];
[tableView reloadData];
}
数据迁移
当您使用任意一个数据库时,您随时都可能打算修改您的数据模型。通过设置 RLMRealmConfiguration.schemaVersion 以及RLMRealmConfiguration.migrationBlock 可以定义一个迁移操作以及与之关联的架构版本。 迁移闭包将会提供提供相应的逻辑操作,以让数据模型从之前的架构转换到新的架构中来。 每当通过配置创建完一个 RLMRealm 之后,迁移闭包将会在迁移需要的时候,将给定的架构版本应用到更新 RLMRealm 操作中。
// 在 [AppDelegate didFinishLaunchingWithOptions:] 中进行配置
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
// 设置新的架构版本。这个版本号必须高于之前所用的版本号(如果您之前从未设置过架构版本,那么这个版本号设置为 0)
config.schemaVersion = 1;
// 设置闭包,这个闭包将会在打开低于上面所设置版本号的 Realm 数据库的时候被自动调用
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
// 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0
if (oldSchemaVersion < 1) {
// 什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构
}
};
// 告诉 Realm 为默认的 Realm 数据库使用这个新的配置对象
[RLMRealmConfiguration setDefaultConfiguration:config];
// 现在我们已经告诉了 Realm 如何处理架构的变化,打开文件之后将会自动执行迁移
[RLMRealm defaultRealm];
Realm可视化操作工具
Realm Browser是Realm的一个可视化操作工具,可以帮助我们更好的读写Realm 数据库,管理起来更加的简单。
以上只是我对Realm简单使用的一个介绍,realm还有很多强大的特点没有介绍到,要想更深层处的了解,可以查阅官网文档,文档写得非常详细。