Realm数据库的简单介绍和使用
给大家介绍一个数据库操作的框架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数据库的简单介绍和使用的更多相关文章
- Mysql数据库的简单介绍与入门
Mysql数据库的简单介绍与入门 前言 一.下载与安装 1.下载 官网下载MYSQL5.7.21版本,链接地址https://www.mysql.com/downloads/.下载流程图如下: 找到M ...
- SQL SERVER数据库的简单介绍
一.数据库技术的发展 数据库技术是应数据管理任务的需求而产生的,先后经历了人工管理.文件系统.数据库系统等三个阶段. 二.关系型数据库 SQL Server属于关系型数据库. 关系模型 以二维表来描述 ...
- redis数据库的简单介绍
NoSQL:一类新出现的数据库(not only sql) 泛指非关系型的数据库 不支持SQL语法 存储结构跟传统关系型数据库中的那种关系表完全不同,nosql中存储的数据都是KV形式 NoSQL的世 ...
- Android SQLite轻量级数据库(简单介绍)
SQLite它是相当于嵌入到安卓里的一个小数据库吧, 它也可以使用SQL语句进行数据库的增删改查操作,但是是SQL1992的语句. 然后SQLite也有自己的语句,但是学过SQL的应该都会发现,它比较 ...
- 数据库-mysql01 简单介绍以及安装部署
本次mysql数据库安装采用二进制安装(免安装即绿色版),数据库版本是mysql5.7.26 首先下载mysql安装包,然后上传服务器里,最后解压. 卸载centos7自带的数据库软件包: [root ...
- [转]Oracle数据库ASH和AWR的简单介绍
在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容. 1.10g之前 用户的连接将产生会话,当 ...
- iOS开发数据库篇—SQLite简单介绍
iOS开发数据库篇—SQLite简单介绍 一.离线缓存 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等. 说明:离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式 (1 ...
- iOS开发数据库篇—FMDB简单介绍
iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...
- SQLite数据库和JPA简单介绍
SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLit ...
随机推荐
- js设置、获取、清除cookie
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- Java安装
java特点:跨平台.简单.面向对像编译后解释再运行安装JDK 环境变量的配置:JAVA_HOME:JDK的根目录====C:\Program Files\Java\jdk1.7.0_25Path:J ...
- E. Change-free
Student Arseny likes to plan his life for n days ahead. He visits a canteen every day and he has alr ...
- 酷派8702手机打开logcat
机器在出厂时将log的级别做了限制,方法是:拨号盘输入*20121220# -> 选择日志输出级别 -> 选择Java log level -> 选择LOGD即可.
- Dockerfile注意事项
准则 尽量将Dockerfile放在空目录中,如果目录中必须有其他文件,则使用.dockerignore文件. 避免安装不必须的包. 每个容器应该只关注一个功能点. 最小化镜像的层数. 多行参数时应该 ...
- 从C#到TypeScript - async await
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- Android系统--Binder系统具体框架分析(二)Binder驱动情景分析
Android系统--Binder系统具体框架分析(二)Binder驱动情景分析 1. Binder驱动情景分析 1.1 进程间通信三要素 源 目的:handle表示"服务",即向 ...
- iOS仿微博客户端一条微博的布局
前言 做一个微博客户端的第三方是自学的第一个实践的项目,自从从事iOS工作之后,就把这个项目给搁置了.趁现在过年回来有些空闲时间,再次修改(总觉得项目就是不停地修改).并且记录一点东西,以后可再回头看 ...
- Linux Bash Shell入门教程
Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...
- laravel中的Database Notifications
创建Post and User模型 php artisan make:model Post php artisan make:model User 创建posts and users 表文件 ph ...