Realm存储的类型和Realm数据库关系存储制

文档类型 : 学习笔记


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已经帮我们做了关联


Realm存储的类型和Realm数据库关系存储制_第1张图片
image_1bkh6ktjo1cd06ct82k1op3uir9.png-31.9kB

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


Realm存储的类型和Realm数据库关系存储制_第2张图片
image_1bkh6u3q0ajj1spsff21r3k1aabm.png-29.7kB

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


Realm存储的类型和Realm数据库关系存储制_第3张图片
image_1bkh6u3q0ajj1spsff21r3k1aabm.png-29.7kB

这里就有人说了和刚刚1对多不是一样吗?

这里数据库是看不到的,但是可以直接拿.

student *stu  = [student allObjects].firstObject;
NSLog(@"stu的狗的主人是-%@",stu.pet.firstObject.master);

Dog *dog = [Dog allObjects].firstObject;
NSLog(@"狗的主人是-%@",dog.master);

打印结果:


Realm存储的类型和Realm数据库关系存储制_第4张图片
image_1bkh7lfbjmbl117ac98cu143k9.png-101.6kB

你可能感兴趣的:(Realm存储的类型和Realm数据库关系存储制)