- Realm的准备
- 模型的创建
.h 文件
@interface Person : RLMObject
/**
Realm支持的数据类型
BOOL、int、NSInteger、long、long long、float、double、NSString、NSDate、NSNumber
注意:!!! 不支持集合类型
*/
@property NSString * name;
@property NSString * address;
@property NSString * schoolName;
@property int age;
@property NSNumber<RLMInt> * score; //NSNumber必须遵守RLMInt协议
@property NSDate * imgDate;
/**针对不支持的属性存储 , 转成NSDate,重新get方法*/
@property (readonly)UIImage * img;
@end
// This protocol enables typed collections. i.e.:
// RLMArray<Person *><Person>
RLM_ARRAY_TYPE(Person)
------------------------------------------------------------------------------------------------------------------------------
.m 文件
@implementation Person
+(NSString *)primaryKey{
return @"name";
}
-(UIImage *)img{
return [UIImage imageWithData:self.imgDate];
}
// Specify default values for properties
//+ (NSDictionary *)defaultPropertyValues
//{
// return @{};
//}
// Specify properties to ignore (Realm won't persist these)
// 忽略的属性赋值
//+ (NSArray *)ignoredProperties
//{
// return @[];
//}
@end
- 新增
// RLMRealm 的创建
-(RLMRealm *)realm{
if (!_realm) {
_realm = [RLMRealm defaultRealm];
}
return _realm;
}
/**
新增, 设置主键key,如果主键key的值相同,不可以进行add操作,否则crash
*/
- (void)dataSave{
/**
数据库存储方式一
initWithValue:如果是数组,则数组的顺序必须和model的属性的先后顺序一致,
如果是字典,则需要指明 key和value
*/
Person * p = [[Person alloc] initWithValue:@{@"name":@"test03",@"schoolName":@"清华大学",@"age":@(32),@"address":@"五道口"}];
[self.realm beginWriteTransaction];
[self.realm addObject:p];
[self.realm commitWriteTransaction];
//方式二
// [self.realm transactionWithBlock:^{
// Person * p1 = [[Person alloc] init];
// p1.name = @"baby";
// p1.age = 20;
// p1.schoolName = @"哈佛大学";
// p1.address = @"北京昌平";
// [self.realm addObject:p1];
// }];
// 方式三:
// [self.realm transactionWithBlock:^{
// //createOrUpdateInRealm 这种方式必须要指定主键key,realm才会知道是更新还是新增
// [Person createOrUpdateInRealm:self.realm withValue:@{@"name":@"哈哈哈",@"age":@(100)}];
//
// }];
//
#pragma mark - 新增一个Son的模型
//新增另一个model数据,添加过一次不能再添加
Son * s = [[Son alloc] initWithValue:@[@"4290019279287",@"刘德华",@"小菜鸡"]];
[self.realm transactionWithBlock:^{
[self.realm addObject:s];
}];
}
- 更新
/**
更新
*/
- (void)dataUpdate{
//注意~!!!!
//更新数据方式一:根据条件取出person
// RLMResults * result = [Person objectsWhere:@"name = 'baby'"];
// Person * p = result.firstObject;
// NSLog(@"%d",p.age);
//
// [self.realm transactionWithBlock:^{
// //在这里修改的person对象一定是被realm管理的,主键不能被修改
// //p.name = @"test002"; crash reason:Primary key can't be changed after an object is inserted
// p.address = @"西城区";
// }];
NSError * error;
[self.realm transactionWithBlock:^{
/**
1. 必须在Person类中定义主键key,设置的value才会生效
2. 设置的value的顺序必须要跟model的属性顺序一致,数据类型要对应
3. 如果主键的值相同,则更新数据,否则是新增数据
*/
[Person createOrUpdateInRealm:self.realm withValue:@[@"test03",@"北京东城区",@"清华大学",@(32)]];
} error:&error];
}
- 删除
/**
删除
*/
-(void)dataDelete
{
//方式一:删除指定的对象,通过where查询
RLMResults * result = [Person objectsWhere:@"name = 'baby'"];
Person * p = result.firstObject;
//一定要开启事务来处理,
[self.realm transactionWithBlock:^{
//查询的object不存在,删除会直接闪退 需要增加容错处理
if (p) {
[self.realm deleteObject:p];
}
}];
//方式二: 通过主键的值,查询要删除的对象,因为主键的值是唯一的,forPrimaryKey: 主键的value值
Person * p2 = [Person objectInRealm:self.realm forPrimaryKey:@"test01"];
[self.realm transactionWithBlock:^{
if (p2) {
[self.realm deleteObject:p2];
}
}];
//方式三:删除某一个特定类型的所有model数据
[self.realm transactionWithBlock:^{
RLMResults * result = [Son allObjects];
for (RLMObject * obj in result) {
[self.realm deleteObject:obj];
}
}];
}
6.查询
/**
查询
1. 所有的查询在realm中,都是一个懒加载,只有当属性被访问时,才能够读取响应的数据,加载到内存中
2. 查询的数据并不是从沙河中,直接拷贝数据,而是一个引用关系,直接修改对象属性的值,数据库表中的值也随即发生改变
3. 一旦进行了检索操作,例如: RLMResults * result = [Son allObjects]; 那么 result集合个数将实时保持更新。
*/
-(void)dataQueue {
//方式一:
//查询一个类型的所有数据
RLMResults * pResult = [Person allObjects];
// NSLog(@"%@",pResult);
RLMResults * sResult = [Son allObjects];
// NSLog(@"%@",sResult);
//方式二: 根据条件查询
RLMResults * pobjcs = [Person objectsWhere:@"name = 'test02'"];
// NSLog(@"%@",pobjcs);
//排序 按照age的值进行升序
RLMResults * sortResult = [pResult sortedResultsUsingKeyPath:@"age" ascending:YES];
NSLog(@"%@",sortResult);
}
-
Realm存储路径