Realm使用

  1. Realm的准备
  • 插件安装
  • Realm Studio安装
  1. 模型的创建
.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 * score; //NSNumber必须遵守RLMInt协议

@property NSDate * imgDate;

/**针对不支持的属性存储 , 转成NSDate,重新get方法*/
@property (readonly)UIImage * img;
@end

// This protocol enables typed collections. i.e.:
// RLMArray
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

  1. 新增
// 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];
    }];
}

  1. 更新
/**
    更新
 */
- (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];
}

  1. 删除
/**
    删除
 */
-(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);
}

  1. Realm存储路径


    Realm路径

你可能感兴趣的:(Realm使用)