什么是Realm
Realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及Android,核心数据引擎C++打造,并不是建立在SQLite之上的ORM, 是拥有独立的数据库存储引擎。
- Realm 核心数据库引擎探秘
- 使用教程
- Realm Browser
- Xcode插件
进阶
支持的数据类型
Realm支持的数据类型有:BOOL
, bool
, int
, NSInteger
, long
, long long
, float
, double
, NSString
, NSDate
, NSData
, NSNumber
。
Realm不支持集合类型。
可以序列化成NSData进行存储,转换成RLMArray<RLMObject>进行存储。
关系
Real支持的数据关系
- 对一关系
- 对多关系
- 反向关系
对一关系
当一个对象持有另外一个对象时, 比如人有一个宠物🐶。
对多关系
//Dog.h
@interface Dog : RLMObject
@property int num;
@property NSString *name;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Dog *><Dog>
//RLM_ARRAY_TYPE 宏创建了一个协议,从而允许 RLMArray<Dog> 语法的使用。
RLM_ARRAY_TYPE(Dog)
//Person.h
#import "Dog.h"
@interface Person : RLMObject
@property int num;
@property NSString *name;
@property RLMArray<Dog *><Dog> *pets;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Person *><Person>
RLM_ARRAY_TYPE(Person)
反向关系
人拥有狗, 狗又有相应的主人
//Person.h
#import "Dog.h"
@interface Person : RLMObject
@property int num;
@property NSString *name;
@property RLMArray<Dog *><Dog> *pets;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Person *><Person>
RLM_ARRAY_TYPE(Person)
实现协议方法, 标明链接关系
//Dog.h
@interface Dog : RLMObject
@property int num;
@property NSString *name;
@property (readonly) RLMLinkingObjects *master;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Dog *><Dog>
//RLM_ARRAY_TYPE 宏创建了一个协议,从而允许 RLMArray<Dog> 语法的使用。
RLM_ARRAY_TYPE(Dog)
//Dog.m
+ (NSDictionary<NSString *,RLMPropertyDescriptor *> *)linkingObjectsProperties {
return @{
@"master": [RLMPropertyDescriptor descriptorWithClass:NSClassFromString(@"Person") propertyName:@"pets"]
};
}
可空属性&默认值&忽略属性
可空属性
默认情况下, 属性值可空, 如果强制要求某个属性非空, 可以使用如下方法:
遵循协议方法,如果再次赋值为nil, 则会抛出异常错误。
+ (NSArray *)requiredProperties {
return @[@"name"];
}
设置默认值
+ (NSDictionary *)defaultPropertyValues {
return @{@"name": @""};
}
忽略属性
不想存储的某些属性,实现方法
+ (NSArray *)ignoredProperties
也可以借助忽略属性&只读属性 打造计算属性, 完成集合以及UIImage
对象的存储与获取
通知
Realm 实例将会在每次写入事务提交后,给其他线程上的 Realm 实例发送通知
获取 Realm 通知
必须强引用返回的token
token = [realm addNotificationBlock:^(NSString *notification, RLMRealm * realm) {
}]
移除通知
[token stop]