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数据库的基本用法
- Realm-在iOS中应用-全新的数据库思维模式
- Realm 在Android中应用
- IOS-Realm 数据库在移动端的使用
- IOS Realm数据库的使用
- Realm在android的应用
- Realm移动应用数据库使用-IOS
- 在android中使用Realm数据库框架
- 如何在Android中使用Realm数据库
- Realm 数据库的使用(iOS &Android)
- iOS开发-Realm数据库
- iOS开发-Realm数据库
- iOS开发-Realm数据库
- iOS开发-Realm数据库
- 在应用环境中如何构造最优的数据库模式
- 【iOS】基于Realm数据库的记账软件--Realm数据库(一)
- Android应用之Realm数据库
- 数据库Realm的使用
- 【iOS】基于Realm数据库的记账软件--前言
- 关于WebView的第N次开发----血泪史(屎)
- 几种排序算法
- iOS Crash解析
- hive 开发疑问
- 有关夜间模式
- Realm-在iOS中应用-全新的数据库思维模式
- jdk环境变量的配置及path、classpath的作用和区别
- 2015 12 3 Handler
- jquery实现带搜索的下拉框
- foreach适合在什么情况下使用+foreach的内部原理剖析
- TS流相关问题
- Centos 6.5安装mongodb3.2.1
- 别让外人知道你在想什么
- 关于listview设置特定item是否可以被选中和点击的设置