Realm简单使用

作者: Iris_Fighting | 来源:发表于2018-04-02 09:02 被阅读15次

    1.介绍

    有需要请查看Realm官网

    1.1 优点-跨平台、简单易用、可视化

    跨平台:现在很多应用都是要兼顾iOS和Android两个平台同时开发。如果两个平台都能使用相同的数据库,那就不用考虑内部数据的架构不同,使用Realm提供的API,可以使数据持久化层在两个平台上无差异化的转换。

    简单易用:Core Data 和 SQLite 冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用 Realm,则可以极大地减少学习成本,立即学会本地化存储的方法。毫不吹嘘的说,把官方最新文档完整看一遍,就完全可以上手开发了。

    可视化:Realm 还提供了一个轻量级的数据库查看工具,在Mac Appstore 可以下载Realm Browser这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。毕竟,很多时候,开发者使用数据库的理由是因为要提供一些所谓的“知识库”。

    1.2 安装

    使用CocoaPods安装
    在项目的Podfile中,添加pod 'Realm',在终端运行pod install

    2.辅助工具安装

    2.1 Realm Studio-用于 Realm 数据库和 Realm 平台的开发者工具

    请点击下载

    2.2 插件

    用来快速创建model
    插件在压缩包里面


    image

    3.Realm的使用

    3.1 Realm中的相关术语

    RLMRealm:Realm是框架的核心所在,是我们构建数据库的访问点,就如同Core Data的管理对象上下文(managed object context)一样。出于简单起见,realm提供了一个默认的defaultRealm( )的便利构造器方法。


    RLMObject::这是我们自定义的Realm数据模型。创建数据模型的行为对应的就是数据库的结构。要创建一个数据模型,我们只需要继承RLMObject,然后设计我们想要存储的属性即可。


    关系(Relationships):通过简单地在数据模型中声明一个RLMObject类型的属性,我们就可以创建一个“一对多”的对象关系。同样地,我们还可以创建“多对一”和“多对多”的关系。


    写操作事务(Write Transactions):数据库中的所有操作,比如创建、编辑,或者删除对象,都必须在事务中完成。“事务”是指位于write闭包内的代码段。


    查询(Queries):要在数据库中检索信息,我们需要用到“检索”操作。检索最简单的形式是对Realm( )数据库发送查询消息。如果需要检索更复杂的数据,那么还可以使用断言(predicates)、复合查询以及结果排序等等操作。


    RLMResults:这个类是执行任何查询请求后所返回的类,其中包含了一系列的RLMObject对象。RLMResults和NSArray类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。

    4. 简单使用

    4.1 创建模型--创建了Person类

    Person.h

    #import <Realm/Realm.h>
    
    @interface Person : RLMObject
    @property NSString *name;
    @property NSInteger age;
    @property NSString *cardID;
    @property NSString *weight;
    @end
    
    // This protocol enables typed collections. i.e.:
    // RLMArray<Person *><Person>
    RLM_ARRAY_TYPE(Person)
    

    Person.m

    #import "Person.h"
    
    @implementation Person
    
    // Specify default values for properties
    //主键
    + (NSString *)primaryKey
    {
        return @"cardID";
    }
    
    //需要添加索引的属性
    + (NSArray *)indexedProperties {
        return @[@"title"];
    }
    
    //默认属性值
    + (NSDictionary *)defaultPropertyValues {
        return @{@"weight":@"100"};
    }
    @end
    

    4.2 存储数据

        RLMRealm *realm = [RLMRealm defaultRealm];
        
        Person *person = [[Person alloc]init];
        person.name = @"小明";
        person.cardID = @"120110";
        [realm beginWriteTransaction];
        [realm addObject:person];
        [realm commitWriteTransaction];
    

    运行,打开

    RLMRealm defaultRealm在模拟器存放如下图:

    image
    打开如下图:
    image

    4.3 删除数据

    1)删除指定的数据:

    - (void)deleteObject:(RLMObject *)object;

    先来存两个数据

        RLMRealm *realm = [RLMRealm defaultRealm];
        
        Person *person = [[Person alloc]init];
        person.name = @"小明";
        person.cardID = @"120110";
        
        Person *person1 = [[Person alloc]init];
        person1.name = @"小红";
        person1.cardID = @"119";
        
        [realm beginWriteTransaction];
        [realm addObject:person];
        [realm addObject:person1];
        [realm commitWriteTransaction];
    

    添加成功


    image
    • 删除小红这条数据
        RLMRealm *realm = [RLMRealm defaultRealm];
        //根据主键查找
        Person *person = [Person objectForPrimaryKey:@"119"];
        NSLog(@"%@",person.name);
        [realm beginWriteTransaction];
        [realm deleteObject:person];
        [realm commitWriteTransaction];
    

    删除成功


    image

    2)删除一组数据:

    - (void)deleteObjects:(id)array;

    3)删除全部的数据:

    - (void)deleteAllObjects;

    4.4 修改数据

    修改数据如果该条数据不存在则会新建一条数据。

    1)针对单个数据进行的修改或新增:

    - (void)addOrUpdateObject:(RLMObject *)object;

    • 例子:把小明的名字改成小小
        RLMRealm *realm = [RLMRealm defaultRealm];
        //根据主键查找
        Person *person = [Person objectForPrimaryKey:@"120110"];
        NSLog(@"%@",person.name);
        [realm beginWriteTransaction];
        person.name = @"小小";
        [realm addOrUpdateObject:person];
        [realm commitWriteTransaction];
        NSLog(@"%@",person.name);
    

    修改成功

    image

    数据库


    image

    2)针对一组数据的修改或新增:

    - (void)addOrUpdateObjectsFromArray:(id)array;

    说明:对于增加、删除、修改必须要在事务中进行操作。

    4.5 查询数据

    1)查询全部数据

    RLMResults *results = [Person allObjects];

    或指定Realm数据库:

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *realmPath = [path stringByAppendingPathComponent:@"你数据库的名字.realm"];
    RLMRealm *realm = [RLMRealm realmWithPath:realmPath];
    RLMResults *results = [Person allObjectsInRealm:realm];
    
    

    2)条件查询

    查询name中带有

    新加了几条数据


    image

    查询

        RLMResults *results = [Person objectsWhere:@"name contains %@",@"小"];
        for (Person *p in results) {
            NSLog(@"名字==%@",p.name);
        }
    

    查询成功


    image

    也可以使用谓词查询:

        NSPredicate *pred = [NSPredicate predicateWithFormat:@"name contains %@", @"小"];
        RLMResults *results = [Person objectsWithPredicate:pred];
        for (Person *p in results) {
            NSLog(@"名字==%@",p.name);
        }
    
    
    image

    3)条件排序

    假设要查询所有分组是iOS和作者是zengjing的文章,然后筛选出来的结果按照num字段进行递增排序:

        RLMResults *results = [[Person objectsWhere:@"name contains %@",@"小"] sortedResultsUsingKeyPath:@"age" ascending:YES];
        for (Person *p in results) {
            NSLog(@"名字=%@,age=%ld",p.name,(long)p.age);
        }
    
    
    image

    4)链式查询(结果过滤)

    假设要查询所有所属分组是iOS的文章,然后从中筛选出作者是zengjing的数据:

        RLMResults *results1 = [Person objectsWhere:@"name contains %@",@"小"];
        RLMResults *results2 = [results1 objectsWhere:@"age = '11'"];
        for (Person *p in results2) {
            NSLog(@"名字=%@,age=%ld",p.name,(long)p.age);
        }
    
    image

    相关文章

      网友评论

        本文标题:Realm简单使用

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