swift realm的运用

前言

由于最近项目中在用Realm,所以把自己实践过程中的一些心得总结分享一下。

Realm是由Y Combinator孵化的创业团队开源出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Realm 2.0.2,支持的平台包括Java,Objective-C,Swift,React Native,Xamarin。

Realm官网上说了好多优点,我觉得选用Realm的最吸引人的优点就三点:

  1. 跨平台:现在很多应用都是要兼顾iOS和Android两个平台同时开发。如果两个平台都能使用相同的数据库,那就不用考虑内部数据的架构不同,使用Realm提供的API,可以使数据持久化层在两个平台上无差异化的转换。
  2. 简单易用:Core Data 和 SQLite 冗余、繁杂的知识和代码足以吓退绝大多数刚入门的开发者,而换用 Realm,则可以极大地减少学习成本,立即学会本地化存储的方法。毫不吹嘘的说,把官方最新文档完整看一遍,就完全可以上手开发了。
  3. 可视化:Realm 还提供了一个轻量级的数据库查看工具,在Mac Appstore 可以下载“Realm Browser”这个工具,开发者可以查看数据库当中的内容,执行简单的插入和删除数据的操作。毕竟,很多时候,开发者使用数据库的理由是因为要提供一些所谓的“知识库”。

. Realm 安装

使用 Realm 构建应用的基本要求:

  1. iOS 7 及其以上版本, macOS 10.9 及其以上版本,此外 Realm 支持 tvOS 和 watchOS 的所有版本。
  2. 需要使用 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()
            
        }
    }

具体细节可以看官方文档。

你可能感兴趣的:(swift realm的运用)