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

realm是一个跨平台移动数据库引擎,支持iOS、OS X(Objective-C和Swift)以及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. 查询结果并不是数据的拷贝:修改查询结果(在写入事务中)会直接修改硬盘上的数据。
3. 一旦检索执行之后, RLMResults 将随时保持更新

2.支持的数据类型

支持的类型包括:BOOL, bool, int, NSInteger, long, long long, float, double, NSString, NSDate, NSData, NSNumber。

缺点是不支持集合类型,其解决方案是 序列化成NSData进行存储  或者 转换成RLMArray<RLMObject>进行存储

3.关系

对一关系
     当一个对象持有另外一个对象时, 比如人有一个宠物

Realm数据库的简单介绍和使用的更多相关文章

  1. Mysql数据库的简单介绍与入门

    Mysql数据库的简单介绍与入门 前言 一.下载与安装 1.下载 官网下载MYSQL5.7.21版本,链接地址https://www.mysql.com/downloads/.下载流程图如下: 找到M ...

  2. SQL SERVER数据库的简单介绍

    一.数据库技术的发展 数据库技术是应数据管理任务的需求而产生的,先后经历了人工管理.文件系统.数据库系统等三个阶段. 二.关系型数据库 SQL Server属于关系型数据库. 关系模型 以二维表来描述 ...

  3. redis数据库的简单介绍

    NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 NoSQL的世 ...

  4. Android SQLite轻量级数据库(简单介绍)

    SQLite它是相当于嵌入到安卓里的一个小数据库吧, 它也可以使用SQL语句进行数据库的增删改查操作,但是是SQL1992的语句. 然后SQLite也有自己的语句,但是学过SQL的应该都会发现,它比较 ...

  5. 数据库-mysql01 简单介绍以及安装部署

    本次mysql数据库安装采用二进制安装(免安装即绿色版),数据库版本是mysql5.7.26 首先下载mysql安装包,然后上传服务器里,最后解压. 卸载centos7自带的数据库软件包: [root ...

  6. [转]Oracle数据库ASH和AWR的简单介绍

    在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容.       1.10g之前 用户的连接将产生会话,当 ...

  7. iOS开发数据库篇—SQLite简单介绍

    iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...

  8. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  9. SQLite数据库和JPA简单介绍

    SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...

随机推荐

  1. ZeroMQ初探

    概述 ZeroMQ(也称为 ØMQ,0MQ 或 zmq)是一个可嵌入的网络通讯库(对 Socket 进行了封装). 它提供了携带跨越多种传输协议(如:进程内,进程间,TCP 和多播)的原子消息的 so ...

  2. Ubuntu纯字符界面的一些设置

    由于Ubuntu的纯字符界面不支持中文显示,所以进行了一些配置,为了更好的显示 1. 把环境语言配置为英文 在用户目录下的".bashrc"文件的结尾处添加以下内容,然后重新登录 ...

  3. 欢迎来到Devil_lixu的技术博客

    Welcome to my blog 如果你觉得内容对你还有一点点的帮助,那就果断点赞吧^_^

  4. Linux实战教学笔记17:精简shell基础

    第十七节 精简shell基础 标签(空格分隔): Linux实战教学笔记 1,前言 1.1 为什么学习shell编程 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, ...

  5. 淘宝API调用 申请 获取session key

    在调用淘宝的API时,我们都会用到appkey,appsecret,appsession. 1.我们申请应用就会有appkey和appsecret了 2.正式环境下获取SessionKey 注意:we ...

  6. 打造“黑客“手机--Kali Nethunter

    从三月份开始,继续更新技术文章.一个月没有更新技术文章了,这一个月有一部分时间是在休息,另一部分时间是在学习汇编和操作系统,沉淀底层和逆向方面的技术. 今年年初,为了玩一下 kali NetHunte ...

  7. 每天一个Linux命令(19)--find命令

    linux 下 find 命令在目录结构中搜索文件,并执行指定的操作.Linux 下 find 命令提供了相当多的查找条件,功能很强大.由于 find 具有强大的功能,所以它的选项也很多,其中大部分选 ...

  8. mybatis系列笔记(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  9. Spark集群搭建_Standalone

    2017年3月1日, 星期三 Spark集群搭建_Standalone Driver:    node1    Worker:  node2    Worker:  node3 1.下载安装 下载地址 ...

  10. Ubuntu14.04: Error found when loading /root/.profile

    问题描述: 启用root账号登录后系统出现如下提示信息: Error found when loading /root/.profile stdin:is not a tty 解决方法: 在终端中用命 ...