iOS开发之 Realm框架基础知识详解

    iOS开发中,开发者要提高开发效率,技巧的掌握必不可少,框架的正确使用更是必不可少。今天小编和大家分享的就是iOS的Realm框架,这个框架是一个比较新的框架,由于文章篇幅问题,就先展示Realm框架的基础部分。


iOS开发之 Realm框架基础知识详解.png


    为了让大家能更好的理解和掌握iOS Realm框架相关知识,本文将通过一个简单的案例为大家展示,这个案例是一位iOS大牛使用Realm框架真实开发APP的过程,一起来看看吧。


在这个案例中,整个 app 只有两个抽象模型(Model)类: Day 和 DrinkLogEntry 。此外,这个 app 也需要这些功能:添加、更新、筛选和排序存储的数据。废话不多说,直接上干货。

 

抽象模型(Model)

 

Realm 中没有像 xcdatamodel-like 这样的文件。抽象模型仅仅是继承自 Object 类的文件。

 

/**

 表示了用户一天的生活。 Day 这个类的信息包含用户所喝的水和他们的每天喝水的目标。

*/

class Day: Object {

    

    dynamic var identifier: String!

    

    /// 表示一天的开始的时间戳(UTC+0 时区)

    dynamic var timestamp: NSTimeInterval = 0

    

    /// 用户所喝的水的量(毫升)

    dynamic var waterDrank: Float = 0

    

    /// 用户每天喝水的目标(毫升)

    dynamic var dailyGoal: Float = 0 // ml

    

    var drinkLogs = List<DrinkLogEntry>()

    

    convenience init(timestamp: NSTimeInterval) {

        self.init()

        self.timestamp = timestamp

        self.identifier = Day.convertTimestampIntoIdentifier(timestamp)

    }

    

    override class func primaryKey() -> String? {

        return "identifier"

    }

    

    override class func indexedProperties() -> [String] {

        return ["identifier"]

    }

    

    class func convertTimestampIntoIdentifier(timestamp: NSTimeInterval) -> String {

        return String(format: "%.0f", arguments: [timestamp])

    }

}

所有前有 dynamic 关键字的属性都会被转化成数据抽象层的一部分。Realm 也支持关系型数据。在这个例子中 Day 这个类中存在 drinkLogs 的一对多关系。一对一的关系就仅是类中的特定属性了。

 

Realm 也支持从 Core Data 中迁移数据。当你需要迁移的时候,可以定义一个闭包并且执行它,然后你就能顺利地执行迁移属性的所有步骤了。

 

索引属性(Indexed properties)和主键(Primary keys)

 

Realm 框架有很多 Core Data 中没有的新特性(也有可能是我没找到,或者说我就是想提一下这点:blush:)。第一点就是「索引属性」了。你可以定义需要被索引的属性集合。当属性个数比较小的时候,搜索会变得很快,有助于性能的提升。

接下来不得不提一下「主键」。你可以定义抽象模型中的一个属性作为它的主键。这能保证更加有效地更新数据以及保证数据的唯一性。

在我使用的这个例子中,主键和索引属性将作为「标识符」,被用于搜索和更新数据。

数据中也可以有被忽略的属性,那些属性将不被持久化保存。

 

创建、更新并写入数据

 

你可以使用未被持久化过的抽象模型,而且这些数据可以被持久化时,你可以将它们写入 Realm 框架中。比起 Core Data,这就是我为什么喜欢 Realm 更多一点 – 因为它能够很好地解决一些临时数据的问题。

 

let day = Day(timestamp: timestamp)

day.dailyGoal = MenuSettings().dailyGoal

 

为了能够写入 Realm 或者从 Realm 中读取,你需要创建 Realm 实例:

let realm = try! Realm()

 

这是如何将数据添加到数据库的方法:

try! realm.write {

    realm.add(day)

}

 

我特别喜欢 Realm 中更新数据的方式。我们假设一下有一部分数据是从网络上下载的,并且他们被映射过而且已经加进了数据库。在数据库中已经存在的数据仅需要更新而不是再次添加。

 

func fetchAll(completion: [Day] -> Void) {

    /**

     假设请求返回了 JSON 并且数据已经映射到了抽象数据层的 Day 类型。

          

     创建的数据还没有存入数据库 Realm 中。

     数据的标识符是相等的时间戳。

     */

    let day1 = Day(timestamp: 0)

    let day2 = Day(timestamp: 86400)

    let day3 = Day(timestamp: 172800)

    

    completion([day1, day2, day3])

}

 

func sync() {

    fetchAll { (days) -> Void in

        let realm = try! Realm()

        try! realm.write {

            /// 如果有相同的标识符,那么它将会被更新。

            realm.add(days, update: true)

        }

    }

}

这是一种比手动查询带有相同标识符然后更新值域更好的方法。

如果更新的参数被置为 false,那么新的数据将具有和在数据库中存在的数据相同的主键。异常会被抛出。

 

这是如何得到所有 Day 类型数据的方法:

let days = realm.objects(Day.self)

 

筛选数据也很简单:

realm.objects(Day.self).filter("identifier == %@", dayIdentifier)

 

按照时间戳升序排列这些数据:

let days = realm.objects(Day.self).sorted("timestamp", ascending: true)

 

当你每次执行 object() 、 sorted() 和 filter() 后均会得到一个 Results<T> 类型的数据。这能让你对结果进行额外的筛选排序等操作 - 这功能非常的强大而且非常好使。

 

结束语

      看了上面案例的演示,大家是不是觉得Realm框架很强悍啊,如果你还没有用过这个框架,不妨可以试试哦~~ iOS  Realm框架使用简单、集成快速,而且功能特性强大,作为iOS开发者,你值得一试哦~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值