前言
由于最近项目中在用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 安装
使用 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)。更加详细的说明见官方文档。
swift安装方法推荐cocoapods:pod 'RealmSwift'
二. 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. 创建数据库
func creatDataBaseWithName(databaseName:String){
var config = Realm.Configuration()
// 使用默认的目录,但是请将文件名替换为用户名
config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(databaseName)")
// 将该配置设置为默认 Realm 配置
Realm.Configuration.defaultConfiguration = config
}
创建表
class TagModel: Object {
///名称
@objc dynamic var name:String = ""
@objc dynamic var id:String = ""
override static func primaryKey() -> String? {
return "name"
}
}
realm的操作对线程有要求,同步等问题困扰着我好久,研究发现执行操作需要放在autoreleasepool中执行,否则线程报错或者数据不同步。
func test66(){
autoreleasepool{
let arr = Realm().objects(TagModel.self)
}
let md = TagModel()
```
autoreleasepool{
let realm = Realm()
realm.beginWrite()
realm.add(md, update: true)
try? realm.commitWrite()
}
}
具体细节可以看官方文档。
网友评论