前言
由于最近项目中在用Realm,所以把自己实践过程中的一些心得总结分享一下。
Realm是由Y Combinator公司孵化出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Realm 2.0.2,支持的平台包括Java,Objective-C,Swift,React Native,Xamarin。
Realm官网上说了好多优点,我觉得选用Realm的最吸引人的优点就三点:
- 跨平台:现在很多应用都是要兼顾iOS和Android两个平台同时开发。如果两个平台都能使用相同的数据库,那就不用考虑内部数据的架构不同,使用Realm提供的API,可以使数据持久化层在两个平台上无差异化的转换。
- 简单易用:Core Data 和 SQLite 冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用 Realm,则可以极大地减少学习成本,立即学会本地化存储的方法。毫不吹嘘的说,把官方最新文档完整看一遍,就完全可以上手开发了。
- 可视化:Realm 还提供了一个轻量级的数据库查看工具,在Mac Appstore 可以下载“Realm Browser”这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。毕竟,很多时候,开发者使用数据库的理由是因为要提供一些所谓的“知识库”。
“Realm Browser”这个工具调试起Realm数据库实在太好用了,强烈推荐。
如果使用模拟器进行调试,可以通过
1 |
[RLMRealmConfiguration defaultConfiguration].fileURL |
打印出Realm 数据库地址,然后在Finder中⌘⇧G跳转到对应路径下,用Realm Browser打开对应的.realm文件就可以看到数据啦.
如果是使用真机调试的话“Xcode->Window->Devices(⌘⇧2)”,然后找到对应的设备与项目,点击Download Container,导出xcappdata文件后,显示包内容,进到AppData->Documents,使用Realm Browser打开.realm文件即可.
自2012年起, Realm 就已经开始被用于正式的商业产品中了。经过4年的使用,逐步趋于稳定。
目录
- 1.Realm 安装
- 2.Realm 中的相关术语
- 3.Realm 入门——如何使用
- 4.Realm 使用中可能需要注意的一些问题
- 5.Realm “放弃”——优点和缺点
- 6.Realm 到底是什么?
- 7.总结
一. Realm 安装
使用 Realm 构建应用的基本要求:
- iOS 7 及其以上版本, macOS 10.9 及其以上版本,此外 Realm 支持 tvOS 和 watchOS 的所有版本。
- 需要使用 Xcode 7.3 或者以后的版本。
注意 这里如果是纯的OC项目,就安装OC的Realm,如果是纯的Swift项目,就安装Swift的Realm。如果是混编项目,就需要安装OC的Realm,然后要把 Swift/RLMSupport.swift 文件一同编译进去。
RLMSupport.swift这个文件为 Objective-C 版本的 Realm 集合类型中引入了 Sequence 一致性,并且重新暴露了一些不能够从 Swift 中进行原生访问的 Objective-C 方法,例如可变参数 (variadic arguments)。更加详细的说明见官方文档。
安装方法就4种:
一. Dynamic Framework
注意:动态框架与 iOS 7 不兼容,要支持 iOS 7 的话请查看“静态框架”。
- 下载最新的Realm发行版本,并解压;
- 前往Xcode 工程的”General”设置项中,从ios/dynamic/、osx/、tvos/
或者watchos/中将’Realm.framework’拖曳到”Embedded Binaries”选项中。确认Copy items if needed被选中后,点击Finish按钮; - 在单元测试 Target 的”Build Settings”中,在”Framework Search Paths”中添加Realm.framework的上级目录;
- 如果希望使用 Swift 加载 Realm,请拖动Swift/RLMSupport.swift
文件到 Xcode 工程的文件导航栏中并选中Copy items if needed; - 如果在 iOS、watchOS 或者 tvOS 项目中使用 Realm,请在您应用目标的”Build Phases”中,创建一个新的”Run Script Phase”,并将
1 |
bash "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework/strip-frameworks.sh" |
这条脚本复制到文本框中。 因为要绕过APP商店提交的bug,这一步在打包通用设备的二进制发布版本时是必须的。
二.CocoaPods
在项目的Podfile中,添加pod ‘Realm’,在终端运行pod install。
三.Carthage
1.在Carthage 中添加github “realm/realm-cocoa”,运行carthage update。为了修改用以构建项目的 Swift toolchain,通过–toolchain参数来指定合适的 toolchain。–no-use-binaries参数也是必需的,这可以避免 Carthage 将预构建的 Swift 3.0 二进制包下载下来。 例如:
1 |
carthage update --toolchain com.apple.dt.toolchain.Swift_2_3 --no-use-binaries |
2.从 Carthage/Build/目录下对应平台文件夹中,将 Realm.framework
拖曳到您 Xcode 工程”General”设置项的”Linked Frameworks and Libraries”选项卡中;
3.iOS/tvOS/watchOS: 在您应用目标的“Build Phases”设置选项卡中,点击“+”按钮并选择“New Run Script Phase”。在新建的Run Script中,填写:
1 |
/usr/local/bin/carthage copy-frameworks |
在“Input Files”内添加您想要使用的框架路径,例如:
1 |
$(SRCROOT)/Carthage/Build/iOS/Realm.framework |
因为要绕过APP商店提交的bug,这一步在打包通用设备的二进制发布版本时是必须的。
四.Static Framework (iOS only)
- 下载 Realm 的最新版本并解压,将 Realm.framework 从 ios/static/文件夹拖曳到您 Xcode 项目中的文件导航器当中。确保 Copy items if needed 选中然后单击 Finish;
- 在 Xcode 文件导航器中选择您的项目,然后选择您的应用目标,进入到 Build Phases 选项卡中。在 Link Binary with Libraries 中单击 + 号然后添加libc++.dylib;
二. Realm 中的相关术语
为了能更好的理解Realm的使用,先介绍一下涉及到的相关术语。
RLMRealm:Realm是框架的核心所在,是我们构建数据库的访问点,就如同Core Data的管理对象上下文(managed object context)一样。出于简单起见,realm提供了一个默认的defaultRealm( )的便利构造器方法。
RLMObject:这是我们自定义的Realm数据模型。创建数据模型的行为对应的就是数据库的结构。要创建一个数据模型,我们只需要继承RLMObject,然后设计我们想要存储的属性即可。
关系(Relationships):通过简单地在数据模型中声明一个RLMObject类型的属性,我们就可以创建一个“一对多”的对象关系。同样地,我们还可以创建“多对一”和“多对多”的关系。
写操作事务(Write Transactions):数据库中的所有操作,比如创建、编辑,或者删除对象,都必须在事务中完成。“事务”是指位于write闭包内的代码段。
查询(Queries):要在数据库中检索信息,我们需要用到“检索”操作。检索最简单的形式是对Realm( )数据库发送查询消息。如果需要检索更复杂的数据,那么还可以使用断言(predicates)、复合查询以及结果排序等等操作。
RLMResults:这个类是执行任何查询请求后所返回的类,其中包含了一系列的RLMObject对象。RLMResults和NSArray类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。
三.Realm 入门——如何使用
由于Realm的API极为友好,一看就懂,所以这里就按照平时开发的顺序,把需要用到的都梳理一遍。
1. 创建数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
- (void)creatDataBaseWithName:(NSString *)databaseName { NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *path = [docPath objectAtIndex:0]; NSString *filePath = [path stringByAppendingPathComponent:databaseName]; NSLog(@"数据库目录 = %@",filePath); RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration]; config.fileURL = [NSURL URLWithString:filePath]; config.objectClasses = @[MyClass.class, MyOtherClass.class]; config.readOnly = NO; int currentVersion = 1.0; config.schemaVersion = currentVersion; config.migrationBlock = ^(RLMMigration *migration , uint64_t oldSchemaVersion) { // 这里是设置数据迁移的block if (oldSchemaVersion < currentVersion) { } }; [RLMRealmConfiguration setDefaultConfiguration:config]ass="crayon-sy">; [RLMRealmConfiguration setDefaultConfiguration:config]25d2ec5003e.png" alt="111194012-fdee34cd97308fac">
前言由于最近项目中在用Realm,所以把自己实践过程中的一些心得总结分享一下。 Realm是由Y Combinator公司孵化出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Realm 2.0.2,支持的平台包括Java,Objective-C,Swift,React Native,Xamarin。 Realm官网上说了好多优点,我觉得选用Realm的最吸引人的优点就三点:
“Realm Browser”这个工具调试起Realm数据库实在太好用了,强烈推荐。 如果使用模拟器进行调试,可以通过
打印出Realm 数据库地址,然后在Finder中⌘⇧G跳转到对应路径下,用Realm Browser打开对应的.realm文件就可以看到数据啦. 如果是使用真机调试的话“Xcode->Window->Devices(⌘⇧2)”,然后找到对应的设备与项目,点击Download Container,导出xcappdata文件后,显示包内容,进到AppData->Documents,使用Realm Browser打开.realm文件即可. 自2012年起, Realm 就已经开始被用于正式的商业产品中了。经过4年的使用,逐步趋于稳定。 目录
一. Realm 安装使用 Realm 构建应用的基本要求:
注意 这里如果是纯的OC项目,就安装OC的Realm,如果是纯的Swift项目,就安装Swift的Realm。如果是混编项目,就需要安装OC的Realm,然后要把 Swift/RLMSupport.swift 文件一同编译进去。 RLMSupport.swift这个文件为 Objective-C 版本的 Realm 集合类型中引入了 Sequence 一致性,并且重新暴露了一些不能够从 Swift 中进行原生访问的 Objective-C 方法,例如可变参数 (variadic arguments)。更加详细的说明见官方文档。 安装方法就4种: 一. Dynamic Framework注意:动态框架与 iOS 7 不兼容,要支持 iOS 7 的话请查看“静态框架”。
这条脚本复制到文本框中。 因为要绕过APP商店提交的bug,这一步在打包通用设备的二进制发布版本时是必须的。 二.CocoaPods在项目的Podfile中,添加pod ‘Realm’,在终端运行pod install。 三.Carthage1.在Carthage 中添加github “realm/realm-cocoa”,运行carthage update。为了修改用以构建项目的 Swift toolchain,通过–toolchain参数来指定合适的 toolchain。–no-use-binaries参数也是必需的,这可以避免 Carthage 将预构建的 Swift 3.0 二进制包下载下来。 例如:
2.从 Carthage/Build/目录下对应平台文件夹中,将 Realm.framework 3.iOS/tvOS/watchOS: 在您应用目标的“Build Phases”设置选项卡中,点击“+”按钮并选择“New Run Script Phase”。在新建的Run Script中,填写:
在“Input Files”内添加您想要使用的框架路径,例如:
因为要绕过APP商店提交的bug,这一步在打包通用设备的二进制发布版本时是必须的。 四.Static Framework (iOS only)
二. Realm 中的相关术语为了能更好的理解Realm的使用,先介绍一下涉及到的相关术语。 RLMRealm:Realm是框架的核心所在,是我们构建数据库的访问点,就如同Core Data的管理对象上下文(managed object context)一样。出于简单起见,realm提供了一个默认的defaultRealm( )的便利构造器方法。 RLMObject:这是我们自定义的Realm数据模型。创建数据模型的行为对应的就是数据库的结构。要创建一个数据模型,我们只需要继承RLMObject,然后设计我们想要存储的属性即可。 关系(Relationships):通过简单地在数据模型中声明一个RLMObject类型的属性,我们就可以创建一个“一对多”的对象关系。同样地,我们还可以创建“多对一”和“多对多”的关系。 写操作事务(Write Transactions):数据库中的所有操作,比如创建、编辑,或者删除对象,都必须在事务中完成。“事务”是指位于write闭包内的代码段。 查询(Queries):要在数据库中检索信息,我们需要用到“检索”操作。检索最简单的形式是对Realm( )数据库发送查询消息。如果需要检索更复杂的数据,那么还可以使用断言(predicates)、复合查询以及结果排序等等操作。 RLMResults:这个类是执行任何查询请求后所返回的类,其中包含了一系列的RLMObject对象。RLMResults和NSArray类似,我们可以用下标语法来对其进行访问,并且还可以决定它们之间的关系。不仅如此,它还拥有许多更强大的功能,包括排序、查找等等操作。 三.Realm 入门——如何使用由于Realm的API极为友好,一看就懂,所以这里就按照平时开发的顺序,把需要用到的都梳理一遍。 1. 创建数据库
|