面试题答案
一键面试1. 导入Realm框架
首先在Swift文件中导入Realm框架:
import RealmSwift
2. 定义数据模型
假设复杂数据模型有一个Person
类,包含name
和一个嵌套的Address
类,Address
类包含city
和street
。
class Address: Object {
@objc dynamic var city = ""
@objc dynamic var street = ""
}
class Person: Object {
@objc dynamic var name = ""
let address = List<Address>()
}
解释:Object
是Realm模型类的基类,属性使用@objc dynamic
修饰以支持Realm的动态特性,List
用于表示一对多关系。
3. 数据插入
func insertData() {
let realm = try! Realm()
let newPerson = Person()
newPerson.name = "John"
let newAddress = Address()
newAddress.city = "New York"
newAddress.street = "123 Main St"
newPerson.address.append(newAddress)
try! realm.write {
realm.add(newPerson)
}
}
解释:首先获取Realm实例,创建Person
和Address
对象并设置属性值,然后通过realm.write
块将新对象添加到Realm数据库中,这确保了数据修改的原子性。
4. 数据查询
func queryData() {
let realm = try! Realm()
let persons = realm.objects(Person.self).filter("name = 'John'")
for person in persons {
print("Person name: \(person.name)")
for address in person.address {
print("Address: \(address.city), \(address.street)")
}
}
}
解释:使用realm.objects(Person.self)
获取所有Person
对象,通过filter
方法进行条件查询,这里查询名字为John
的人,然后遍历结果并输出相关信息。
5. 数据更新
func updateData() {
let realm = try! Realm()
if let person = realm.objects(Person.self).filter("name = 'John'").first {
try! realm.write {
person.name = "Jane"
if let address = person.address.first {
address.city = "Los Angeles"
}
}
}
}
解释:先查询出需要更新的Person
对象,然后在realm.write
块中对其属性进行修改,同样保证了数据修改的原子性。
性能优化
- 批量操作:在插入或更新数据时尽量使用批量操作,减少
realm.write
块的次数,如在插入多个Person
对象时:
func insertMultiplePeople() {
let realm = try! Realm()
let people = [Person(), Person()]
people[0].name = "Alice"
people[1].name = "Bob"
try! realm.write {
realm.add(people)
}
}
- 索引:对于经常用于查询的属性,可以添加索引来提高查询性能。例如,给
Person
的name
属性添加索引:
class Person: Object {
@objc dynamic var name = ""
let address = List<Address>()
override static func primaryKey() -> String? {
return "name"
}
}
这里将name
属性设置为主键,主键会自动添加索引。
- 懒加载:Realm的
List
和LinkingObjects
是懒加载的,在访问时才会从数据库加载数据,减少初始加载的开销。例如,Person
中的address
列表只有在实际访问时才会加载数据。