Realm-Swift使用入门

本文介绍了如何在Swift中使用Realm数据库,包括安装、配置、打开数据库、对象操作(如存储、更新、删除)、查询操作(条件、排序、链式查询)以及通知和数据迁移等关键知识点,适合Swift开发者学习掌握。
摘要由CSDN通过智能技术生成

Realm适用iOS和Android平台,本身相比sqlite、CoreData操作简单,在这里记录下使用方式; (Swift4.2)

安装

pod 'RealmSwift'

基础使用

打开 Realm 数据库

要打开一个 Realm 数据库,首先需要初始化一个新的 Realm 对象:

let realm = try! Realm()
try! realm.write {
    realm.add(myDog)
}
复制代码

这将会初始化出一个默认 Realm 数据库。

配置 Realm 数据库

  • 可配置本地 Realm 数据库在磁盘上的路径;
  • 对于可同步 Realm 数据库而言,可以配置管理用户,以及服务器上的远程路径;
  • 配置版本迁移
  • 压缩功能,高效地利用磁盘空间。
func setDefaultRealmForUser(username: String) {
	var config = Realm.Configuration()
	// 使用默认的目录,但是请将文件名替换为用户名
	config.fileURL = config.fileURL!.deletingLastPathComponent().appendingPathComponent("\(username).realm")
	// 将该配置设置为默认 Realm 配置
	Realm.Configuration.defaultConfiguration = config
}
复制代码

操作 Realm 对象

对象的自更新

Object 实例是底层数据的动态体现,会自动进行更新;因此这意味着无需去刷新对象的当前状态。修改某个对象的属性,会立即影响到所有指向该对象的其他实例。

let myDog = Dog()
myDog.name = "Fido"
myDog.age = 1
try! realm.write {
	realm.add(myDog)
}
let myPuppy = realm.objects(Dog.self).filter("age == 1").first
try! realm.write {
	myPuppy!.age = 2
}
print("age of my dog: \(myDog.age)") // => 2
复制代码

这不仅使得 Realm 保证高速和高效,同时还让代码更为简洁、更为灵活。如果您的 UI 代码基于某个特定的 Realm 对象来实现,那么在触发 UI 重绘以前,您根本无需进行数据刷新或者重新检索。

对象存储

对象的所有更改(添加、修改和删除)都必须在写入事务内完成。

Realm 对象可以被实例化,还可作为未管理对象使用(例如,还未添加到 Realm 数据库),并且使用方式与其它正常 Swift 对象无异。然而,如果要在线程之间共享对象,或者在应用启动后反复使用,那么您必须将这些对象添加到 Realm 数据库中。向 Realm 数据库中添加对象必须在写入事务内完成。由于写入事务将会产生无法忽略的性能消耗,因此您应当检视您的代码,以确保尽可能减少写入事务的数量。

warning:Realm 的写入操作是同步以及阻塞进行的,它并不会异步执行。如果线程 A 开始进行写入操作,然后线程 B 在线程 A 结束之前,对相同的 Realm 数据库也执行了写入操作,那么线程 A 必须要在线程 B 的写入操作发生之前,结束并提交其事务。写入事务会在 beginWrite() 执行时自动刷新,因此重复写入并不会产生竞争条件。

更新对象

Realm 提供了一系列更新对象的方法,根据使用场景的不同, 每个方法都有各自的优缺点。

直接更新

您可以在写入事务中,通过设置对象的属性从而完成更新。

// 在事务中更新对象
try! realm.write {
    author.name = "Thomas Pynchon"
}复制代码
键值编码

Object、Result 和 List 均允许使用 键值编码(KVC)。 当您需要在运行时决定何种属性需要进行更新的时候, 这个方法就非常有用了。 批量更新对象时,为集合实现 KVC 是一个很好的做法, 这样就不用承受遍历集合时为每个项目创建访问器 所带来的性能损耗。

let persons = realm.objects(Person.self)
try! realm.write {
    persons.first?.setValue(true, forKeyPath: "isFirst")
    // 将每个 person 对象的 planet 属性设置为 "Earth"
    persons.setValue("Earth", forKeyPath: "planet")
}复制代码
通过主键更新

如果数据模型类中包含了主键,那么 可以使用 Realm().add(_:update:),从而让 Realm 基于主键来自动更新或者添加对象。

// 创建一个 book 对象,其主键与之前存储的 book 对象相同
let cheeseBook = Book()
cheeseBook.title = "Cheese recipes"
cheeseBook.price = 9000
cheeseBook.id = 1
// 更新这个 id = 1 的 book
try! realm.write {
    realm.add(cheeseBook, update: true)
}复制代码

如果这个主键值为 “1” 的 Book 对象已经存在于数据库当中 ,那么该对象只会进行更新。如果不存在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值