Realm使用

  1. Realm的准备
  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<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

  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路径
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容