Realm-在iOS中应用-全新的数据库思维模式

来源:互联网 发布:卡特背扣绝杀猛龙数据 编辑:程序博客网 时间:2024/05/20 15:12

什么是realm?免费吗?开源吗?

概述

Realm是由Y Combinator公司孵化的一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库(旨在取代CoreData和Sqlite)。Realm并不是对Core Data的简单封装,相反地,Realm并不是基于Core Data,也不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。
这里写图片描述

总的来说,Realm,为移动设备而生,目的是替代 SQLite 和 Core Data。有过开发iOS数据库的筒子们都知道,传统的SQLite 和 Core Data都离不开SQL语句,如果不是使用娴熟,会觉得代码极其繁琐。而Realm就是为了让程序员从中解脱。

优点

Easy to Use(简单易用):Core Data和SQLite冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用Realm,则可以极大地减少学习代价和学习时间,让应用及早用上数据存储功能。

Cross-Platform(跨平台):现在绝大多数的应用开发并不仅仅只在iOS平台上进行开发,还要兼顾到Android平台的开发。为两个平台设计不同的数据库是愚蠢的,而使用Realm数据库,iOS和Android无需考虑内部数据的架构,调用Realm提供的API就可以完成数据的交换,实现“一个数据库,两个平台无缝衔接”。

Fast(高效):Realm相比使用CoreData和原生的SQLite来说速度更快更加高效,而且代码量更少。

开源!免费!

官网地址:https://realm.io/cn/
该网址包含了全部所有需要的资料;

集成realm(以下只介绍object-c版本)

总共有4种方法:

这里写图片描述

推荐使用CocoaPods

安装CocoaPods 0.37.1 或者更高版本;在您的Podfile中,添加pod 'Realm'到您的 app 目标中,添加pod 'Realm/Headers'到您的测试目标中;在终端运行pod install;采用 CocoaPods 生成的.xcworkspace来运行工程!

强有力的查看数据库工具

这里写图片描述

使用这个工具,让程序员完全摆脱了传统的sqlite语句,让你可以轻松编辑和查看!

能够集成进Xcode的Realm工具

为了方便程序员使用,他们还开发了一个插件,

安装方法:(官网文档有介绍)
安装 Realm 插件的最简单方式是通过点击”RealmPlugin”文件夹下的Alcatraz。您也可以手动进行安装:打开release zip 中的plugin/RealmPlugin.xcodeproj并进行编译,重启 Xcode之后插件即可生效。如果您使用 Xcode 菜单来建立一个新文件(File > New > File… — or ⌘N) ,您就可以看到有一个新建Realm模型的选项。

Realm基本使用及注意点

默认的数据库

RLMRealm *realm = [RLMRealm defaultRealm];

自定义数据库

对于某些应用,如果需要切换账套然后进而切换不用的数据库数据的话,那么用Realm真的就太方便了,主要有两个步骤:
(1)首先要有每个账号对应下的不用数据库,可以考虑以账号为数据库命名:

//dbName:就是账号,每个账号对应一个dbName,这样,就能够每个账号对应生成一个Realm数据库;   NSString *dbName  = [model.dbid stringByAppendingString:@".realm"];                                NSString *dbPath = [DZ_PATH_OF_DOCUMENT stringByAppendingPathComponent:dbName];                                NSFileManager *manager  =  [NSFileManager defaultManager];                                if (![manager fileExistsAtPath:dbPath]) {                                    RLMRealm *realm = [RLMRealm realmWithPath:dbPath];                                    //这行代码就能够实现:如果该目录下没有以dbName命名的数据库存在,那么则生成该数据库,如果已经存在,则realm就是该数据库                                }

(2)切换不同的数据库:

//传入需要切换成的数据库的名字username,则可以通过下列函数实现自定义数据库的切换+ (void)setDefaultRealmForUser:(NSString *)username {    RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];    // 使用默认的目录,但是使用用户名来替换默认的文件名    config.path = [[[config.path stringByDeletingLastPathComponent]                    stringByAppendingPathComponent:username]                   stringByAppendingPathExtension:@".realm"];    // 将这个配置应用到默认的 Realm 数据库当中    [RLMRealmConfiguration setDefaultConfiguration:config];}

Realm模型

使用Realm,最重要的是要使用Realm模型的思想去生成各种各种的模型以供数据库存储和查询;最简便的方法是使用Realm Xcode插件插件自动生成Realm模型。
主要有以下几个步骤

1.创建模型

模型1:狗狗模型

#import <Realm/Realm.h>// 狗狗的数据模型@interface Dog : RLMObject@property NSString *name;@property Person   *owner;@endRLM_ARRAY_TYPE(Dog) // 定义RLMArray<Dog>// 实现文件@implementation Dog@end // 暂时没用

2.使用模型:

定义了模型后,就能够生成objective-C模型去使用,非常方便;
注意:在该模型未曾使用过数据库进行存储时,该模型是和普通模型一模一样的,也就是说,可以正常修改该模型的属性,但是因为未存入数据库,所以不会存储;

3.将模型存进数据库本地

如果要存储,也非常方便:

// 创建对象Dog *dog = [[Dog alloc] init];dog.name    = @"大卫·福斯特·华莱士";// 获取默认的 Realm 实例RLMRealm *realm = [RLMRealm defaultRealm];// 每个线程只需要使用一次即可// 通过事务将数据添加到 Realm 中[realm beginWriteTransaction];[realm addObject:dog];[realm commitWriteTransaction];

仅需上面几步,就能够将该模型存进数据库了;

4.已存在该模型,更新模型中的数据

// 获取默认的 Realm 实例RLMRealm *realm = [RLMRealm defaultRealm];// 在一个事务中更新对象[realm beginWriteTransaction];dog.name = @"托马斯·品钦";//dog是某个realm模型对象[realm commitWriteTransaction];

注意:如果已经存过该类模型在数据库中,如果要更改该模型的某个属性的值,则一定要在事务中更新数据,不然会报错,不能简单地写成:

dog.name = @"托马斯·品钦";

上述写法是错误的,因为缺少了beginWriteTransaction和commitWriteTransaction。数据库会报错;

5.如果两个模型间存在从属关系,则:

模型2:狗狗主人模型:

// 狗狗主人的数据模型@interface Person : RLMObject@property NSString      *name;@property NSDate        *birthdate;@property RLMArray<Dog> *dogs;@endRLM_ARRAY_TYPE(Person) // 定义RLMArray<Person>@implementation Person@end // 暂时没用

例如上文,主人可以有多个狗狗:RLMArray *dogs,这时,按照原来的方法生成一个主人模型后,使用下列方法添加狗狗对象;

// ZhangSan是大黄(dahuang)以及所有名字叫“小白”的狗狗的主人RLMResults<Dog> *someDogs = [Dog objectsWhere:@"name contains '小白'"];[ZhangSan.dogs addObjects:someDogs];//someDogs是狗狗的合计、数组[ZhangSan.dogs addObject:dahuang];

那么问题来了,如果我要查询某个狗狗的主人呢?很方便,方法如下:
(1)狗狗模型中要有这句:

@property Person   *owner;

然后在狗狗的模型中加入:

// 定义“owners”,和 Person.dogs 建立反向关系- (NSArray *)owners {    return [self linkingObjectsOfClass:@"Person" forProperty:@"dogs"];}

这是就将狗狗模型和Person联系在一起了;
如果要查询狗狗的主人,只需要:

RLMResults *somePersons = dog.owner;

查询数据库:

数据库的查询也是非常重要的,realm提供了以下查询的方式:

全部结果

// 查询默认的 Realm 数据库RLMResults *dogs = [Dog allObjects]; // 从默认的 Realm 数据库中,检索所有狗狗// 查询指定的 Realm 数据库RLMRealm *petsRealm = [RLMRealm realmWithPath:@"pets.realm"]; // 获得一个指定的 Realm 数据库RLMResults *otherDogs = [Dog allObjectsInRealm:petsRealm]; // 从该 Realm 数据库中,检索所有狗狗

条件检索:

// 使用断言字符串查询RLMResults *tanDogs = [Dog objectsWhere:@"color = '棕黄色' AND name BEGINSWITH ''"];// 使用 NSPredicate 查询NSPredicate *pred = [NSPredicate predicateWithFormat:@"color = %@ AND name BEGINSWITH %@",                                                     @"棕黄色", @"大"];tanDogs = [Dog objectsWithPredicate:pred];

注意:返回的结果RLMResults记得要判断下是否该数据有值,防止后面如果要访问属性而引发代码会崩溃;

注意点:

(1)Realm目前单线程操作比较安全,所以,使用时尽量注意要在同一个线程操作Realm;否则会有意料不到的错误;

参考资料

Realm数据库基础教程

iOS中Realm数据库的基本用法

1 0