一、簡介
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/zh-tw/n/146540.html