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