美文网首页收藏问题Realm临时收藏
iOS Realm简单使用(增删改查和排序)

iOS Realm简单使用(增删改查和排序)

作者: 爱做梦的星星 | 来源:发表于2017-07-08 21:09 被阅读410次

    文档类型: 学习笔记


    最近学习Realm,还是一个非常好用的数据库,相对于Sqlite,不需要学习那么累,基本上初级使用者官方文档看完,1天就可以开发了.


    Realm文章链接:

    1.iOS Realm简单使用(增删改查和排序)

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

    3.Realm可空属性,默认值,忽略属性,通知

    4.Realm用户机制,数据库操作,数据库迁移


    Realm是一个跨平台的移动数据库引擎,支持iOS,OS X(OS Swift)和安卓.

    Realm是一个基于C++的数据库而不是sqlite.


    安装(最简单的方式)

    pod 'Realm'
    

    关于Realm详细的文档可以参考Realm官网

    Realm数据库工具在Appstore中可以免费下载

    RealmRealm

    Realm插件可以通过Alcatraz,(关于iOS8以上安装插件方法见我的另一篇文章)Xcode 8+插件的安装方法

    Realm Xcode插件Realm Xcode插件

    安装结束了,开始使用!


    1.创建realm对象

    //使用Realm创建对象
    //导入框架
    
    #import <Realm/Realm.h>
    
    //继承RLMObject
    @interface student : RLMObject
    
    //对象的属性声明,注意请不要带上nonatomic,assign,strong等这样修饰的词(官方推荐避免引起奇葩错误),readonly可以但是在realm里面有新的作用,后面讲.
    @property NSString *name;
    @property int number;
    
    @end
    
    // This protocol enables typed collections. i.e.:
    // RLMArray<student *><student>
    // Realm中需要声明对象
    RLM_ARRAY_TYPE(student)
    
    //关于对象的模型可以安装realm官方插件
    

    2.存储realm对象

    //1.快速Realm创建对象
    //第一种
    student *stu = [[student alloc] initWithValue:@{@"number":@2,@"name":@"xxx"}];
    
    //第二种(顺序是和声明的顺序一致)
    student *stu  = [[student alloc] initWithValue:@[@"zhangsan",@26]];
    
    //第三种
    student *stu = [[student alloc] init];
    stu.name = @"网二";
    stu.number = @9;
    
    //2.存储对象(realm种存储对象一定要开启事务)
    
    //拿到操作realm的数据库对象写入
    RLMRealm *realm = [RLMRealm defaultRealm];
    
    //第一种方法
    //开启事务
    [realm beginWriteTransaction];
    
    //存储对象
    [realm addObject:stu];
    
    //提交事务
    [realm commitWriteTransaction];
    
    //第二种方法
    [realm transactionWithBlock:^{
        [realm addObject:stu];
    }];
    
    //第三种
    [realm transactionWithBlock:^{
        [student createInRealm:realm withValue:@[@"zhangsan",@26]];
    }];
    
    //注1:Realm里面没有回滚,可以通过检查error来判断是否添加成功
    - (BOOL)commitWriteTransaction:(NSError **)outError;
    //注2:一旦将对象存入Realm中就意味着这个对象已经被Realm管理,并且已经和磁盘上的对象进行了地址映射
    

    查看刚刚存储的Realm对象(地址是app沙盒的Documents目录下)

    app沙盒路径(app运行时打断点,然后po NSHomeDirectory())

    app沙盒路径app沙盒路径
    使用Realm数据库工具打开
    image_1bkgni2sea0n1rqj1m8v1p911ap1r.png-44.9kBimage_1bkgni2sea0n1rqj1m8v1p911ap1r.png-44.9kB

    2.更新对象

    Realm种是直接在事务中更新对象

    student *stu  = [[student alloc] initWithValue:@[@"zhangsan",@26]];
    
    //拿到操作realm的数据库对象
    RLMRealm *realm = [RLMRealm defaultRealm];
    
    [realm transactionWithBlock:^{
        [realm addObject:stu];
    }];
    
    //更新数据
    //第一种
    [realm transactionWithBlock:^{
        stu.name = @"lisi";
    }];
    
    //第二种根据主键更新
    //studen.m声明主键
    
    image_1bkgodi0o1iqv1h5n3o3ur91g9u2l.png-24.2kBimage_1bkgodi0o1iqv1h5n3o3ur91g9u2l.png-24.2kB
    注:如果主键一定要一开始设置,不然会报错涉及到数据库迁移,后面说.
    注:这里修改的模型一定是被Realm所管理的模型才可以
    
    image_1bkgoi5vc1m605lvetk1pcp1l4n32.png-20.6kBimage_1bkgoi5vc1m605lvetk1pcp1l4n32.png-20.6kB
    [realm transactionWithBlock:^{
        [realm addOrUpdateObject:stu];
    }];
    
    //第三种
    [realm transactionWithBlock:^{
        [student createOrUpdateInRealm:realm withValue:@[@"lisi",@26]];
    }];
    

    看效果: image_1bkgo620v1vmfulkvf0u02frt28.png-25.5kBimage_1bkgo620v1vmfulkvf0u02frt28.png-25.5kB


    3.删除数据

    //被删除的模型一定是要求被Realm所管理的
    //第一步取出来需要删除的对象
    RLMResults *results = [student objectsWhere:@"number = 26"];
    student *lisi = results.firstObject;//这里就存了一个对象
    
    //删除单条数据
    [realm transactionWithBlock:^{
        [realm deleteObject:lisi];
    }];
    
    //根据主键删除模型
    student *stuDelete = [student objectInRealm:realm forPrimaryKey:@26];
        [realm transactionWithBlock:^{
            [realm deleteObject:stuDelete];
        }];
    
    //删除1张模型表数据
    RLMResults *stuResult = [student allObjects];
    for (student *stu in stuResult) {
        [realm transactionWithBlock:^{
            [realm deleteObject:stu];
        }];
    }
    
    //删除所有的模型数据(慎用)
    [realm deleteAllObjects];
    

    4.查询数据

    注意点

    • 1.所有的查询(包括查询和属性访问)在Realm中都是延迟加载的,只有当属性被访问的时候,才能够读取相应的属性,所有可以直接搜大量数据,结果中也仅仅是数据对应本地的地址而已.
    • 2.查询的结果并不是数据的拷贝而是对应数据地址的映射:修改查询的结果(在写入事务中)会直接修改硬盘上的数据.
    • 3.一旦检索执行之后,RLMResults将随时保持更新
    //上述第一点和第二点就不代码了,感兴趣试下,第三点上代码
        student *stu = [[student alloc] initWithValue:@{@"number":@26,@"name":@"lisi"}];
    
        RLMRealm *realm = [RLMRealm defaultRealm];
        [realm transactionWithBlock:^{
            [realm addObject:stu];
        }];
    
        RLMResults *results = [student allObjects];
        NSLog(@"%@",results);
    
    
        student *stu2 = [[student alloc] initWithValue:@{@"number":@23,@"name":@"lisi111"}];
        [realm transactionWithBlock:^{
            [realm addObject:stu2];
        }];
    
        NSLog(@"%@",results);
    

    打印结果:

    image_1bkh4gmmi1o0j1v6skkq9hbfpk3f.png-112kBimage_1bkh4gmmi1o0j1v6skkq9hbfpk3f.png-112kB
    // 1.查询所有类对象
    RLMResults *results = [student allObjects];
    
    // 2.主键查询
    student *stu = [student objectInRealm:realm forPrimaryKey:@26];
    
    // 3.非主键查询
    RLMResults *results = [student objectsWhere:@"number = 26"];
    
    // 4.在结果的子集继续查
    RLMResults *results = [student allObjects];
    [results objectsWhere:@"number > 0"];
    //可以一直查
    
    // 5.如果你要查从第7条之后10条
    // 解决:RLMResults *results = [student allObjects];
    // 直接查出所有然后for循环便利,不用担心内存炸了,它的结果仅仅是地址映射而已,上述已将
    
    //等等
    

    排序结果集

    /**
     *  结果集升序降序
     *
     *  @param NSString 按照哪个字段排列
     *
     *  @param ascending YES升序
     *
     *  @return 排序后的结果集
     */
    [results sortedResultsUsingKeyPath:@"number" ascending:YES];
    
    

    相关文章

      网友评论

        本文标题:iOS Realm简单使用(增删改查和排序)

        本文链接:https://www.haomeiwen.com/subject/bmpjhxtx.html