文档类型 : 学习笔记
Realm文章链接:
1.iOS Realm简单使用(增删改查和排序)
2.Realm存储的类型和Realm数据库关系存储制
3.Realm可空属性,默认值,忽略属性,通知
4.Realm用户机制,数据库操作,数据库迁移
1.Realm支持的类型
BOOL, bool, int, NSInteger, long, long long, float, double, NSString, NSData, NSDate, NSNumber
//支持以上几种格式.
//关于集合类或者对象类可以转化成NSData类存储,这边举例图片
//存储对象类
@interface student : RLMObject
@property NSString *name;
@property int number;
@property UIImage *image;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(student)
//使用代码
student *stu = [[student alloc] init ];
stu.name = @"xxx";
stu.number = 25;
stu.image = [UIImage imageNamed:@"xxx"];
//这样写是直接报错的
//不能直接存UIImage
//方法:
//增加一个属性
@property NSData *imageData;
//忽略image属性字段,让他存NSData属性字段
//1.在image属性字段前面加上readonly,Realm内部有操作这种readonly的字段会直接忽略
@property (readonly)UIImage *image;
//2.在.m中的忽略方法中返回
+ (NSArray *)ignoredProperties
//然后重写image属性字段set方法,这样就OK了
- (void)setImage:(UIImage *)image {
_image = [UIImage imageWithData:_imageData];
}
// 字典和数组也可以这么干,序列化存储
Realm数据库关系存储
1.1对1
// 学生类
#import
#import "Dog.h"
@interface student : RLMObject
@property NSString *name;
@property int number;
@property Dog *pet;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(student)
// 小狗
#import
@interface Dog : RLMObject
@property NSString *name;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(Dog)
// 存储
Dog *dog = [[Dog alloc] initWithValue:@{@"name":@"anni"}];
student *stu = [[student alloc] initWithValue:@[@"xxx",@25,dog]];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[realm addObject:stu];
}];
结果:OK,Realm已经帮我们做了关联
2.1对多
// 学生类
#import
#import "Dog.h"
@interface student : RLMObject
@property NSString *name;
@property int number;
//在realm里面不能用NSArray,用RLMArray,这个里面放的是RLMObject
@property RLMArray *pet;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(student)
// 小狗
#import
@interface Dog : RLMObject
@property NSString *name;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(Dog)
//存储
Dog *dog = [[Dog alloc] initWithValue:@{@"name":@"anni"}];
Dog *dog2 = [[Dog alloc] initWithValue:@{@"name":@"xixi"}];
student *stu = [[student alloc] initWithValue:@[@"xxx",@25,@[dog,dog2]]];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[realm addObject:stu];
}];
结果:OK
3.多对1
// 狗同时有几个学生主人
// 狗类.h
#import
@interface Dog : RLMObject
@property NSString *name;
//用readonly忽略
@property (readonly) RLMLinkingObjects *master;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(Dog)
//狗类.m需要方法描述master是啥
//学生类
@interface student : RLMObject
@property NSString *name;
@property int number;
//在realm里面不能用NSArray,用RLMArray,这个里面放的是RLMObject
@property RLMArray *pet;
@end
// This protocol enables typed collections. i.e.:
// RLMArray
RLM_ARRAY_TYPE(student)
//存储
Dog *dog = [[Dog alloc] initWithValue:@{@"name":@"anni"}];
Dog *dog2 = [[Dog alloc] initWithValue:@{@"name":@"xixi"}];
student *stu = [[student alloc] initWithValue:@[@"xxx",@25,@[dog,dog2]]];
RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock:^{
[realm addObject:stu];
}];
结果:OK
这里就有人说了和刚刚1对多不是一样吗?
这里数据库是看不到的,但是可以直接拿.
student *stu = [student allObjects].firstObject;
NSLog(@"stu的狗的主人是-%@",stu.pet.firstObject.master);
Dog *dog = [Dog allObjects].firstObject;
NSLog(@"狗的主人是-%@",dog.master);
打印结果: