我有两节课。首先看起来像这样:
class Person: Object {
dynamic var owner: String?
var dogs: List<Dogs>()
}
和第二类看起来像这样:
class Dogs: Object {
dynamic var name: String?
dynamic var age: String?
}
现在位于'viewDidLoad'的ViewController
中我创建了空Person
的对象List
并将其保存在Realm中
func viewDidLoad(){
let person = Person()
person.name = "Tomas"
try! realm.write {
realm.add(Person.self)
}
}
效果很好我可以创建Person
,当我尝试在SecondViewController
ViewDidLoad
中读取此数据时,问题就开始了:
var persons: Results<Person>?
func viewDidLoad(){
persons = try! realm.allObjects()
}
并尝试将新Dog
添加到List
按钮操作中执行此操作:
@IBAction func addDog(){
let newDog = Dogs()
newDog.name = "Rex"
newDog.age = "2"
persons[0].dogs.append(newDog)
// in this place my application crashed
}
此处我的应用程序崩溃了一条信息:Can only add, remove, or create objects in a Realm in a write transaction - call beginWriteTransaction on an RLMRealm instance first.
如何向Dog
添加新的List
以及如何更新人员[0]?
我使用SWIFT 3.0
答案 0 :(得分:9)
persons
属性的类型为Results<Person>
,它是一个包含由Realm管理的Person
个对象的集合。为了修改托管对象的属性,例如将新元素附加到列表属性,您需要在写入事务中。
try! realm.write {
persons[0].dogs.append(newDog)
}
答案 1 :(得分:2)
写下这样的东西:
if let person = persons?[0] {
person.dogs.append(newDog)
}
try! realm.write {
realm.add(person, update: true)
}
请检查您是如何获得realm
的。每次拨打defaultRealm
时,您都会获得新的境界。
答案 2 :(得分:1)
附注:除了在写入事务中添加代码来解决您的问题之外,您还可以按名称查询Person
,如下所示...
@IBAction func addDog(){
let newDog = Dogs()
newDog.name = "Rex"
newDog.age = "2"
let personName = realm.objects(Person.self).filter("name = 'Tomas'").first!
try! realm.write {
personName.dogs.append(newDog)
}
}
答案 3 :(得分:0)
为领域数据库添加对象
class Task : Object {
@objc dynamic var id : Int = 0
@objc dynamic var name = ""
@objc dynamic var phone = ""
@objc dynamic var address = ""
}
@IBAction func buttonSave(_ sender: Any) {
let realm = try! Realm()
let user = Task()
user.id = 0
user.name = (txtName.text! as NSString) as String
user.phone = (txtPhone.text! as NSString) as String
user.address = (txtAddress.text! as NSString) as String
try! realm.write {
realm.add(user)
print("user:",user.name)
}
}