一、简介
iOSRealm是一个轻量级的本地数据库,它能够持久化存储数据并支持数据查询。iOSRealm是为了简化iOS开发而设计的数据库,它与CoreData相比,更加简洁、易用,且性能更高。iOSRealm可以持久化存储任何类型的数据,包括对象、数组和字典。
二、基础使用
iOSRealm是如何在我们的项目中工作的呢?最基础的使用步骤如下:
步骤一:创建一个数据模型
import RealmSwift
class Person: Object {
@objc dynamic var name = ""
@objc dynamic var age = 0
}
步骤二:在你的应用程序中初始化一个Realm对象。
let realm = try! Realm()
步骤三:将数据保存到Realm中:
let person = Person()
person.name = "John"
person.age = 18
try! realm.write {
realm.add(person)
}
步骤四:从Realm中检索数据:
let result = realm.objects(Person.self)
print(result.count) // 打印:1
三、Realm的基本操作
1. 创建和更新
如果您已经定义了Realm中的数据模型,那么您可以使用`create(_:update:)`方法添加一个新的对象:
let person = Person(value: ["name": "Sarah", "age": 21])
try! realm.write {
realm.create(Person.self, value: person, update: .all)
}
使用`write(_:)`方法将新的对象添加到数据源中。如果已经存在具有相同主键的对象,则会更新该对象。
使用“update”参数可控制如何更新现有对象。下面是针对每个选项的解释:
- all:用提供的数据完全替换所有属性值。
- modified:只更新修改过的属性。
- error:如果数据模型中没有指定要更新的属性,则引发异常。
2. 查询
Realm提供了许多查询方式来帮助您查找特定的对象或子集:
(1)使用‘filter(_:)’方法
`filter(_:)`方法用于根据提供的条件过滤出一个结果集:
let predicate = NSPredicate(format: "name BEGINSWITH %@", "J")
let filteredResults = realm.objects(Person.self).filter(predicate)
(2)使用‘sorted(by:)’方法
`sorted(by:)`方法是对结果集执行排序操作:
let sortedResults = realm.objects(Person.self).sorted(byKeyPath: "age")
(3)使用聚合方法
Realm还提供了各种聚合方法,比如“sum(_:)”、“average(_:)”、“min(_:)”,可以帮助你更好地理解你的数据:
let ages = realm.objects(Person.self).value(forKeyPath: "@sum.age") as! Int
四、线程管理
iOSRealm支持多线程操作,但需要注意一些规则。IOSRealm是线程安全的,并发访问是安全的,但是不能在不同线程上共享对象和结果,误用会导致崩溃。
通常,我们会将Realm对象与UI线程隔离并在后台线程上操作它。为了保护Realm的线程安全性,我们可以使用`ThreadSafeReference`。
下面是一个范例,演示如何使用ThreadSafeReference从其他线程读取Realm对象:
let realm = try! Realm()
let person = Person()
person.name = "Rose"
person.age = 24
try! realm.write {
realm.add(person)
}
let personReference = ThreadSafeReference(to: person)
DispatchQueue(label: "background").async {
autoreleasepool {
let realm = try! Realm()
let person = realm.resolve(personReference)
print(person?.name) // 打印: Optional("Rose")
}
}
五、总结
对于想要使用简单而高效的本地存储技术来持久化数据的开发者来说,iOSRealm是一个非常好的选择。它的功能非常强大,随时可用,还有许多非常有用的功能。
最后附上全部的代码示例:
// 定义模型
import RealmSwift
class Person: Object {
@objc dynamic var name = ""
@objc dynamic var age = 0
}
// 增
let person = Person()
person.name = "John"
person.age = 18
let realm = try! Realm()
try! realm.write {
realm.add(person)
}
// 删
// 获取要删除的项并执行删除
let predicate = NSPredicate(format: "name = %@", "John")
let persons = realm.objects(Person.self).filter(predicate)
try! realm.write {
realm.delete(persons)
}
// 改
let firstPerson = realm.objects(Person.self).first
try! realm.write {
firstPerson?.name = "New Name"
}
// 查
let filteredResults = realm.objects(Person.self).filter(predicate)
// 多线程操作
let personReference = ThreadSafeReference(to: person)
DispatchQueue(label: "background").async {
autoreleasepool {
let realm = try! Realm()
let person = realm.resolve(personReference)
print(person?.name) // 打印: Optional("Rose")
}
}
原创文章,作者:NPIP,如若转载,请注明出处:https://www.506064.com/n/146540.html