sqliteRealm数据持久化方案的简要介绍和采取

给大家介绍一个数据库操作的框架Realm,本文主要以iOS 平台的选用情况为例。

realm是一个跨平台移动数据库引擎,协助iOS、OS
X(Objective-C和斯威夫特)以及Android;

着力数据引擎由C++打造,并不是创造在SQLite之上的ORM,
拥有独立的数据库存储引擎;

据官方称性能上比sqlite, coredata牛逼,而且使用起来更为简明, 更易入门。

下载地址:https://realm.io/cn/

使用教程:https://realm.io/docs/objc/latest/

 

援助工具:

1、Realm Browser:可视化访问 Realm 数据库。

2、Xcode插件:可以飞快创造Realm可存储模型对象。https://github.com/alcatraz/Alcatraz

 

开始Realm实战:

 

为了匡助您更好地领略 Realm 的利用,上边大家将会对 Realm
的连锁术语和严重性类进行一个大约的介绍:

 

  • RLMRealm : RLMRealm
    是框架的主干所在,是大家构建数据库的访问点,就不啻 Core Data
    的管理对象上下文( managed  object context )一样。出于简单起见,
    realm 提供了一个名为 defaultRealm
    的单例,在本教程中我们就仅使用这几个单例来完毕大家所需的出力。当然,我们也得以导入外部已经编制好的
    realm 数据库文件,也足以在大家不必要将数据保存在硬盘上时使用 “
    内存实例对象 ” ( in-memory realm instance
    ),其余,还是可以而且利用几个数据库文件。

  • RLMObject :那是大家自定义的 realm
    数据模型。创制数据模型的表现将会影响到数据库的结构。要创建一个数据模型,大家只须要屡次三番RLMObject ,然后设计我们想要存储的习性即可。

  • 关系 (Relationships) :通过简单地在数据模型中宣示一个 RLMObject
    类型的特性,大家就足以创立一个 “ 一对多 ” 的靶子关联。同样地,借助
    RLMArray 大家还足以创建 “ 多对一 ” 和 “ 多对多 ” 的涉及。

  • 写操作事务 (Write
    Transactions)
     :数据库中的所有操作,比如创造、编辑,或者去除对象,都不可能不在事务中成功。
    “ 事务 ” 是指位于 beginWriteTransaction() 以及
    commitWriteTransaction() 操作之间的代码段。

  • 查询 (Queries) :要在数据库中寻觅音讯,大家须求用到 “ 检索 ”
    操作。检索最简便易行的款型是对 RLMObject 对象发送 allObjects()
    信息。若是需求寻找更复杂的数目,那么还足以行使断言( predicates
    )、复合查询以及结果排序等等操作。

  • RLMResults :那个类是执行此外查询请求后所归来的类,其中包蕴了一多级的
    RLMObjects 对象。和 NSArray
    类似,我们得以用下标语法来对其举行访问,并且还足以控制它们之间的关联。不仅如此,它还有着众多更强大的功效,包罗排序、查找等等操作。

 

1.简便的多少操作

1.1备选: 创制数据模型, 继承自RLMObject

创制对象的办法:1. 一般成立;2.
由此父类RLMObject中的方法急迅成立 initWithValue。

请留心,所有的画龙点睛属性都无法不在对象添加到 Realm 前被赋值,由于Realm
在大团结的引擎内部有很好的语义解释系统,所以 Objective‑C
的比比皆是性质特性将被忽略,如nonatomic, atomic, strong, copy 和 weak 等。
因而为了幸免误解,官方推荐在编辑数据模型的时候绝不使用其他的属性特性。

1.2 使用RLMRealm对象, 保存指定模型

有3种写入措施,首先获得RLMRealm对象:RLMRealm *realm = [RLMRealm
defaultRealm];

  • 写入措施1  :

//开启写入事务

[realm beginWriteTransaction];

//添加模型对象

[realm addObject:stu];

//提交写入事务

[realm commitWriteTransaction]; 

  • 写入措施2:

[realm transactionWithBlock:^{

        [realm addObject:stu];

    }];

  • 写入措施3:

[Stu createInRealm:realm withValue:@{@”stu_id”: @22, @”name”:
@”马冬梅2″, @”age”: @666}];

 

1.3 使用RLMRealm对象, 更新指定模型

主意1:在工作中从来更新目的

[realm beginWriteTransaction];

stu.name = @”土豆”;

[realm commitWriteTransaction];

艺术2:依照主键举办立异

//1. 渴求操作的模子, 必须贯彻情势+ (NSString *)primaryKey 再次回到主键
//2. 在作业中调用方法
[realm addOrUpdateObject:stu2];

办法3:依照主键举办翻新
//1. 渴求操作的模型, 必须兑现形式+ (NSString *)primaryKey 重返主键
//2. 在作业中调用方法
[Stu createInRealm:realm withValue:@{@”stu_id”: @22, @”name”:
@”马冬梅2″, @”age”: @666}];

 

1.4 使用RLMRealm对象, 删除数据

  • 剔除指定的对象(在作业中)

[realm deleteObject:stu];
只顾: 必须是从realm数据库中取得的模型对象, 而不是协调创制的
RLMObject *obj = [realm objectWithClassName:@”Stu”
forPrimaryKey:@2];

  • 除去所有目的(在事情中)

[realm deleteAllObjects];

1.5 使用RLMRealm对象, 查询数据

  • 此间引出链式查询的定义:在询问结果的根底上, 举行二次查询,如下:

[stus objectsWhere:@”address beginswith ‘北京'”];

  • 排序:

[stus sortedResultsUsingProperty:@”name” ascending:YES];

  • 分页:

瞩目:查询出来的结果对象是懒加载, 唯有真正访问时, 才会加载相应对象, 所以,
那里的分页, 其实就是从所有集合中分页获取即可。代码演示:
RLMResults<Dog *> *dogs = [Dog allObjects];
for (NSInteger i = 0; i < 5; i++) {
Dog *dog = dogs[i];
// …
}

  • 规则查询

RLMResults<Stu *> *stus = [Stu objectsWhere:@”name =
‘马冬梅'”];
询问所有:[Stu allObjects];注意事项:

  1. 抱有的询问(包蕴查询和品质访问)在 Realm
    中都是延迟加载的,唯有当属性被访问时,才可以读取相应的多寡
    2.
    查询结果并不是数据的正片:修改查询结果(在写入事务中)会直接修改硬盘上的数额。
  2. 假使检索执行之后, RLMResults 将时刻保持更新

2.协理的数据类型

匡助的品类包蕴:BOOL, bool, int, NSInteger, long, long long, float,
double, NSString, NSDate, NSData, NSNumber。

缺点是不协助集合类型,其解决方案是 连串化成NSData举行仓储
 或者 *转换成RLMArray<RLMObject>进行仓储*

 

3.关系

 

对一涉及
     当一个目的具备其余一个目的时, 比如人有一个宠物

对多关系

  1. 在Dog中, 听从指定协议方式
    RLM_ARRAY_TYPE(Dog)
    RLM_ARRAY_TYPE 宏创造了一个商事,从而允许 RLMArray<Dog>
    语法的利用。
  2. 在Person中, 定义属性
    @property (nonatomic, strong) RLMArray<Dog *><Dog>
    *dogs;
    注:即便可以给 RLMArray 属性赋值为
    nil,不过那仅用于“清空”数组,而不是用以移除数组。那意味你总是可以向一个
    RLMArray 属性中加上对象,就算其被置为了 nil。

反向关系

举例:人拥有狗, 狗又有对应的持有者?
贯彻方式:

  1. Dog中定义属性
    @property (readonly) RLMLinkingObjects *master;
  2. 完结协议章程, 标明链接涉及
  • (NSDictionary<NSString *,RLMPropertyDescriptor *>
    *)linkingObjectsProperties {
    return @{
    @”master”: [RLMPropertyDescriptor
    descriptorWithClass:NSClassFromString(@”Stu”) propertyName:@”dogs”]
    };
    }

 

未完待续。。。

网站地图xml地图