如何更正具有一对多关系的更新领域的对象?
How to correct update realm's objects that have one-to-many relationships?
如何更正具有一对多关系的更新领域的对象?
想象一下,我有 UIViewController 以某种方式显示用户的个人资料。
它是一个具有以下接口的 RLMObject:
class RDBUserProfile: RLMObject {
dynamic var name = ""
dynamic var places = RLMArray(objectClassName: "RDBPlace")
}
用户可以编辑个人资料。当用户想要更改位置时,我会显示模式 UITableViewcontroller 及其列表。
这个 UITableViewcontroller 有这样的界面:
class PlacesListViewController: UITableViewController {
private var dataSource = [[RDBPlace]]()
var choosenPlaces: [RDBPlace]?
...
}
我将 RLMArray 转换为数组并将其从初始 viewController 传递到 PlacesListViewController 的 属性 "choosenPlaces",如下所示:
func placesList() -> [RDBPlace] {
var result = [RDBPlace]()
for object in RDBUserProfile.currentProfile().places {
let place = objects as! RDBPlace
result.append(place)
}
return result
}
在 PlacesListViewController 中,我以某种方式用 RDBPlace 数组填充 "dataSource"(但不存储在 Realm 中)。
如果来自 "choosenPlaces" 的 RDBPlace 等于来自 "dataSource" 的 RDBPlace,我将其标记为 "choosen"。
如果需要,用户可以取消标记或标记任何新标记。然后他点击 "done",我关闭 PlacesListViewController 并传递给 UIViewController 新的 RDBPlace 数组。
如果用户想要保存更改,他点击 "save"。
我像这样更新 RDBUserProfile:
let userProfile = RDBUserProfile.currentProfile()
let realm = RLMRealm.defaultRealm()
realm.transactionWithBlock {
realm.deleteObjects(RDBPlace.allObjects())
userProfile.places.addObjects(places)
}
当用户选择同一组位置或向现有位置添加新位置时发生错误(崩溃)。
我从领域中删除 if 并尝试在同一事务中添加相同的对象。
如何正确删除所有未连接到 userProfile 的 RDBPlace?
这里的问题是您正在删除您试图添加到 RLMArray
的对象。
您可以执行类似以下操作来避免异常:
realm.deleteObjects(Set(RDBPlace.allObjects()).subtract(places)
如何更正具有一对多关系的更新领域的对象?
想象一下,我有 UIViewController 以某种方式显示用户的个人资料。 它是一个具有以下接口的 RLMObject:
class RDBUserProfile: RLMObject {
dynamic var name = ""
dynamic var places = RLMArray(objectClassName: "RDBPlace")
}
用户可以编辑个人资料。当用户想要更改位置时,我会显示模式 UITableViewcontroller 及其列表。 这个 UITableViewcontroller 有这样的界面:
class PlacesListViewController: UITableViewController {
private var dataSource = [[RDBPlace]]()
var choosenPlaces: [RDBPlace]?
...
}
我将 RLMArray 转换为数组并将其从初始 viewController 传递到 PlacesListViewController 的 属性 "choosenPlaces",如下所示:
func placesList() -> [RDBPlace] {
var result = [RDBPlace]()
for object in RDBUserProfile.currentProfile().places {
let place = objects as! RDBPlace
result.append(place)
}
return result
}
在 PlacesListViewController 中,我以某种方式用 RDBPlace 数组填充 "dataSource"(但不存储在 Realm 中)。
如果来自 "choosenPlaces" 的 RDBPlace 等于来自 "dataSource" 的 RDBPlace,我将其标记为 "choosen"。
如果需要,用户可以取消标记或标记任何新标记。然后他点击 "done",我关闭 PlacesListViewController 并传递给 UIViewController 新的 RDBPlace 数组。
如果用户想要保存更改,他点击 "save"。 我像这样更新 RDBUserProfile:
let userProfile = RDBUserProfile.currentProfile()
let realm = RLMRealm.defaultRealm()
realm.transactionWithBlock {
realm.deleteObjects(RDBPlace.allObjects())
userProfile.places.addObjects(places)
}
当用户选择同一组位置或向现有位置添加新位置时发生错误(崩溃)。 我从领域中删除 if 并尝试在同一事务中添加相同的对象。
如何正确删除所有未连接到 userProfile 的 RDBPlace?
这里的问题是您正在删除您试图添加到 RLMArray
的对象。
您可以执行类似以下操作来避免异常:
realm.deleteObjects(Set(RDBPlace.allObjects()).subtract(places)