持久化方案-Realm(二)

2018-09-20  本文已影响23人  aaayia

持久化方案-Realm(一):基本使用

什么是Realm

Realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及Android,核心数据引擎C++打造,并不是建立在SQLite之上的ORM, 是拥有独立的数据库存储引擎。

进阶

支持的数据类型

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]

上一篇 下一篇

猜你喜欢

热点阅读