我CatalogItem在我的代码的主键的对象.Realm在写入期间在以下代码中抛出错误:
class CartItem: Object {
dynamic var id: Int = 0
dynamic var item: CatalogItem!
dynamic var amount: Int = 0
convenience required init(id: Int, item: CatalogItem, amount: Int) {
self.init()
self.id = id
self.item = item
self.amount = amount
}
}
class Cart: Object {
var items = List<CartItem>()
func addItem(item: CatalogItem) {
let realm = try! Realm()
let newItem = CartItem(id: item.id, item: item, amount: 1)
do {
try realm.write {
items.append(newItem)
}
} catch let e {
handleError(e)
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误:
'RLMException', reason: 'Can't set primary key property 'id' to existing value '352'.'
Run Code Online (Sandbox Code Playgroud)
我希望Realm引用现有的CatalogItem但看起来它正在尝试添加另一个.有没有办法实现这种关系?注意:所有对象都存储在一个领域中.
如果将非托管Realm对象附加到托管List,则将创建该非托管对象.但是,使用现有主键创建对象是错误的.如果Realm.add(_:update: true)对象不存在,您可以使用它来指定要创建的对象,否则使用您传入的新值更新现有对象的属性.
所以我认为你希望你的addItem()功能看起来像这样:
func addItem(item: CatalogItem) {
let realm = try! Realm()
let newItem = CartItem(id: item.id, item: item, amount: 1)
do {
try realm.write {
realm.add(newItem, update: true)
items.append(newItem)
}
} catch let e {
handleError(e)
}
}
Run Code Online (Sandbox Code Playgroud)
正如 jpsim 指出的,问题是我尝试将非托管对象附加到 Realm,并且数据库中有一个具有相同主键的对象。我必须以不同的方式解决问题,因为建议的解决方案会删除领域中存在的对象的属性。
func addItem(item: CatalogItem) {
let realm = try! Realm()
var catalogItem = item
if item.realm == nil,
let foundItem = realm.objects(CatalogItem)
.filter("id == %@", item.id).first {
catalogItem = foundItem
}
let newItem = CartItem(id: item.id, item: catalogItem, amount: 1)
do {
try realm.write {
items.append(newItem)
}
} catch let e {
handleError(e)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2079 次 |
| 最近记录: |