Swift开发Realm

Realm - swift

2017-02-21  本文已影响207人  撸码是一种情怀

realm 介绍及安装

Realm 是一个跨平台的移动终端数据库,支持 iOS(Swift 和 Objective-C 语言都支持)和 Android。Realm 的目的就是提供比 SQLite 和 Core Data 更好更快的数据库支持。它不仅仅是更好和更快,而且更加易于使用,短短几行代码就可以完成很多操作。Realm 完全免费,你可以随意使用它。Realm 是为移动设备而生的,因为在过去的十年中,移动终端的数据库技术没有任何的革新。现在如果和移动终端的数据库打交道,你只有一种选择,使用 SQLite 或者是底层封装了 SQLite 的技术比如 Core Data。Realm 的目的是更加易用,它并不是一个建立在 SQLite 之上的 ORM,而是一个基于自己的持久化引擎,简单并且快速的面向对象移动数据库。

realm 插件及浏览器

realm 使用及创建

realm 数据增加

    class Dog: Object {
        dynamic var type = ""
        dynamic var name = ""
        dynamic var age = 0
        dynamic var id = ""
        // 主键,唯一一行被标记的属性
        override static func primaryKey()-> String {
            return "age" // 必须是属性,必须是不一样的内容
        }
        
        override static func ignoredProperties() -> [String] {
            return ["type"]
        }
    }

    
        // 实例化一个dog对象
        let dog1 = Dog()
        dog1.name = "dogName"
        dog1.age = 1
        dog1.id = "dog1"
        // 获取reaml
        let reaml = try! Realm()
        // 加入数据
        try! reaml.write {
            reaml.add(dog1,update: true)
       }

realm 数据查找

如果您熟悉NSPredicate的话,那么您就能很容易掌握其在 Realm 中的查询方法。Objects、Realm、List 以及 Results 都提供了方法,允许您通过简单地传递一个 NSPredicate 实例、断言字符串或者断言格式化字符串来完成查询这顶Object实例的操作,正如您在 NSArray 中执行查询的哪样。

比如说,下面的例子就展示了如何通过从默认的 Realm 数据库中调用 Results().filter(_:...) 方法来检索所有棕黄色,并且以“大”开头命名的狗狗的:

    // 使用断言字符串查询
    var tanDogs = realm.objects(Dog).filter("color = '棕黄色' AND name BEGINSWITH '大'")
    
    // 使用 NSPredicate 查询
    let predicate = NSPredicate(format: "color = %@ AND name BEGINSWITH %@", "棕黄色", "大")
    tanDogs = realm.objects(Dog).filter(predicate)

查看苹果的断言编程指南来获取更多关于断言查询和NSPredicate Cheatsheet的使用信息。 Realm 支持许多常见的断言:

realm 数据修改

Realm 提供了一系列用以更新数据的方式,这些方式都有着各自所适应的情景。请选择最符合您当前需求的方式来使用:

// 在一个事务中更新对象
let author = ···
try! realm.write {
  author.name = "托马斯·品钦"
}

将 KVC 应用在集合当中是大量更新对象的极佳方式,这样就可以不用经常遍历集合,为每个项目创建一个访问器了。

let persons = realm.objects(Person)
try! realm.write {

// 修改一个对象的属性
  persons.first?.setValue(true, forKeyPath: "isFirst")
  // 将每个人的 planet 属性设置为“地球”
  persons.setValue("地球", forKeyPath: "planet")
}
// 主键,唯一一行被标记的属性
override static func primaryKey()-> String {
   return "age" // 必须是属性,必须是不一样的内容
}
class Dog: Object {
        dynamic var type = ""
        dynamic var name = ""
        dynamic var age = 0
        dynamic var id = ""
        // 主键,唯一一行被标记的属性
        override static func primaryKey()-> String {
            return "age" // 必须是属性,必须是不一样的内容
        }
        
        override static func ignoredProperties() -> [String] {
            return ["type"]
        }
    }

    
        // 实例化一个dog对象
        let dog1 = Dog()
        dog1.name = "dogName"
        dog1.age = 1
        dog1.id = "dog1"
        // 获取reaml
        let reaml = try! Realm()
        // 直接更新
        try! reaml.write {
            reaml.add(dog1,update: true)
       }

realm 数据删除

通过在写入事务中将要删除的对象传递给 Realm().delete(_:) 方法,即可完成删除操作。

// let cheeseBook = ... 存储在 Realm 中的 Book 对象

// 在事务中删除一个对象
try! realm.write {
realm.delete(cheeseBook)
}

// 删除多个
let dogs = reaml.objects(Dog.self).filter("age=2")
try! reaml.write {
  reaml.delete(dogs)
}


您也能够删除存储在 Realm 中的所有数据。注意,Realm 文件的大小不会被改变,因为它会保留空间以供日后快速存储数据。

// 从 Realm 中删除所有数据
try! realm.write {
  realm.deleteAll()
}

realm 数据排序

Results 允许您指定一个排序标准,从而可以根据一个或多个属性进行排序。比如说,下列代码将上面例子中返回的狗狗根据名字升序进行排序:

// 排序名字以“B”开头的棕黄色狗狗
let sortedDogs = realm.objects(Dog.self).filter("color = 'tan' AND name BEGINSWITH 'B'").sorted(byProperty: "name")

realm 通知

Realm 实例将会在每次写入事务提交后,给其他线程上的 Realm 实例发送通知:

// 获取 Realm 通知
let token = realm.addNotificationBlock { notification, realm in
    viewController.updateUI()
}

// 随后---一般在deinit方法中调用
token.stop()
文档参考:

<a href="https://realm.io/cn/docs/swift/latest/#section">中文文档 </a>
<a href="https://realm.io/docs/swift/latest/#getting-started">英文文档</a>

上一篇下一篇

猜你喜欢

热点阅读