iOS Realm 使用总结

官方档说明:https://realm.io/cn/docs/objc/latest/
安装就按照文档上说的来就可以了
**可以下载个插件 来快速创建model 插件在压缩包里面 文档上也有说明 **

#import <Realm/Realm.h>
@interface Beacons: RLMObject

@property NSString *uuid;
@property NSString * major;
@property NSString *minor;
@end
RLM_ARRAY_TYPE(Beacons)

@interface Wifi : RLMObject

@property NSString *bssid;
@property NSString *ssidname;
@end
RLM_ARRAY_TYPE(Wifi)
@class Mall;
@interface Floor : RLMObject
@property NSString *name;
@property NSString *floor_key;
@property RLMArray<Beacons*><Beacons> *beacons;
@property RLMArray<Wifi*><Wifi> *wifi;
@end

RLM_ARRAY_TYPE(Floor)

@interface Mall : RLMObject
@property NSString *key;
@property NSString *latitude2;
@property NSString *longitude2;
@property RLMArray<Floor*><Floor>  *floors;
@end
RLM_ARRAY_TYPE(Mall)

@interface Building : RLMObject
@property NSString *user;
@property NSString *scanTime;
@property NSString *mall_key;
@property Mall *mall;
@property BOOL isSent;
@end
RLM_ARRAY_TYPE(Building)
//添加默认值
@implementation Mall
+ (NSDictionary *)defaultPropertyValues
{
    return @{@"latitude2":@"0.0",@"longitude2":@"0.0"};
}

操作方式

[realm beginWriteTransaction];
[realm commitWriteTransaction];

或者 block方式

[realm transactionWithBlock:^{
 
}];

储存


        RLMRealm *realm = [RLMRealm defaultRealm];
        Building *building = [[Building alloc]init];
        building.user = [AppVariables sharedInstance].user.username;
        NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
        [formatter setDateFormat:@"yyyy-MM-dd"];
        building.scanTime = [formatter stringFromDate:[NSDate date]];
        Mall *mall = [[Mall alloc]init];
        mall.key = mallkey.key;
        mall.longitude2 = [NSString stringWithFormat:@"%f",[AppVariables sharedInstance].dynamicLocation.longitude];
        mall.latitude2 = [NSString stringWithFormat:@"%f",[AppVariables sharedInstance].dynamicLocation.latitude];
        building.mall_key = mall.key;
        building.mall = mall;
        [realm transactionWithBlock:^{
            [realm addObject:building];
        }];

更新

  • 找到这个object 然后修改它的属性就可以更新数据了

RLMResults *results = [Building objectsWhere:@"mall_key = %@",self.mall_key];
        Building *building = results.firstObject;
        RLMResults *queryFloor = [building.mall.floors objectsWhere:@"name = %@",titleMessage];
        if (queryFloor.count == 0) {
            RLMRealm *realm = [RLMRealm defaultRealm];
            NSString *floor_key = [NSUUID UUID].UUIDString;
            [realm transactionWithBlock:^{
                Floor *floor = [[Floor alloc]init];
                floor.floor_key = floor_key;
                floor.name = titleMessage;
                [building.mall.floors addObject:floor];
            }];
        }

查询

  • 注意查询过后RLMResults不是一个NSArray
  • 可以通过- (RLMObjectType)objectAtIndex:(NSUInteger)index;来获取下标对象
RLMResults *results = [Building objectsWhere:@"mall_key = %@",self.mall_key];

查询所有

[Building allObjects]

删除

[realm beginWriteTransaction];
[realm deleteObject:cheeseBook];
[realm commitWriteTransaction];

或者

[realm transactionWithBlock:^{
 [realm deleteObject:cheeseBook];
}];

删除多条数据

 [realm beginWriteTransaction];
 [realm deleteObjects:[Building allObjects]];
 [realm commitWriteTransaction];

删除所有

[realm beginWriteTransaction];
[realm deleteAllObjects];
[realm commitWriteTransaction];

最坑的地方

  • 每次更改数据结构的时候都会产生crash 如果在调试的时候还好 可以删除APP 然后重新调试,如果在更新APP的时候需要覆盖安装,我们就需要把数据库迁移
  RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
    // 设置新的架构版本。这个版本号必须高于之前所用的版本号(如果您之前从未设置过架构版本,那么这个版本号设置为 0)
    config.schemaVersion = 1;
    
    // 设置闭包,这个闭包将会在打开低于上面所设置版本号的 Realm 数据库的时候被自动调用
    config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
        // 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0
        if (oldSchemaVersion < 1) {
            // 什么都不要做!Realm 会自行检测新增和需要移除的属性,然后自动更新硬盘上的数据库架构
        }
    };
    
    // 告诉 Realm 为默认的 Realm 数据库使用这个新的配置对象
    [RLMRealmConfiguration setDefaultConfiguration:config];
    
    // 现在我们已经告诉了 Realm 如何处理架构的变化,打开文件之后将会自动执行迁移
    [RLMRealm defaultRealm];
  • 如果上面的方法不适合你 可以看看下面的
原模型为
@interface Person : RLMObject
@property NSString *firstName;
@property NSString *lastName;
@property int age;
@end


想变更为  把 firstName 和 lastName 合并在一起
@interface Person : RLMObject
@property NSString *fullName;
@property int age;
@end
  RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];

// 在 [AppDelegate didFinishLaunchingWithOptions:] 中进行配置RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];

  config.schemaVersion = 1;

  config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {

   // 目前我们还未进行数据迁移,因此 oldSchemaVersion == 0 
  if (oldSchemaVersion < 1) { 
    // enumerateObjects:block: 方法遍历了存储在 Realm 文件中的每一个“Person”对象

     [migration enumerateObjects:Person.className block:^(RLMObject *oldObject, RLMObject *newObject) {
     // 将名字进行合并,存放在 fullName 域中 
      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",oldObject[@"firstName"], oldObject[@"lastName"]];
 }]; 
}};

  [RLMRealmConfiguration setDefaultConfiguration:config];

有问题欢迎来评论区留言

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 先从数据库最基本的增删查改来看realm怎么用 // 增 // 删 // 查 // 改 realm其余的关系与属性...
    LJMagicCoder阅读 3,582评论 0 6
  • 空气里弥漫的是阴雨连绵的湿润气息。窗外的雾随着夜幕降临而散去,只能看见荒凉郊外树木的暗影。 每次都是一个人坐着十几...
    柠檬你的西柚阅读 410评论 0 3
  • 第八十一章 [原文] 信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。圣人不积,既以为人己愈有,既以与...
    道形图阅读 393评论 0 11