gpt4 book ai didi

ios - Realm iOS - 如何更新列表?

转载 作者:行者123 更新时间:2023-12-05 07:12:09 36 4
gpt4 key购买 nike

我在 iOS 上将 Codable 与 Realm 结合使用,发现更新保存在 Realm 中的现有记录时出现问题。数据由项目列表组成,其中每个项目都有类别列表,每个类别都有描述。

这就是我的 Realm Codable 模型的样子

class Items: Object, Decodable {

@objc dynamic var id: String = ""
@objc dynamic var name: String = ""
let categories = List<Categories>()
@objc dynamic var desc: Desc?

override static func primaryKey() -> String? {
return "id"
}

var hasSubCategories: Bool {
if self.categories.count > 0 {
return true
}
return false
}

enum CodingKeys: String, CodingKey {
case id
case name
case desc
case categories
}

required init() {
super.init()
}

required init(from decoder: Decoder) throws {

let container = try decoder.container(keyedBy: CodingKeys.self)

id = try container.decode(String.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
desc = try (container.decodeIfPresent(Desc, forKey: .desc))
let categoriesList = try container.decodeIfPresent(List<Categories>.self, forKey: .categories) ?? List<Categories>()
categories.append(objectsIn: categoriesList)
super.init()
}
}

class Categories: Object, Decodable {

@objc dynamic var id: String = ""
@objc dynamic var name: String = ""
@objc dynamic var desc: Desc?
let categories = List<Categories>()

override static func primaryKey() -> String? {
return "id"
}

var hasSubCategories: Bool {
if categories.count > 0 {
return true
}
return false
}

enum CodingKeys: String, CodingKey {
case id
case name
case categories
}

required init() {
super.init()
}

required init(from decoder: Decoder) throws {

let container = try decoder.container(keyedBy: CodingKeys.self)

id = try container.decode(String.self, forKey: .id)
name = try container.decode(String.self, forKey: .name)
desc = try (container.decodeIfPresent(Desc, forKey: . desc))
let categoriesList = try container.decodeIfPresent(List<Categories>.self, forKey: .categories) ?? List<Categories>()
categories.append(objectsIn: categoriesList)
super.init()
}
}

我使用以下代码添加从 API 收到的新项目

let realm = try? Realm()

for item in ItemsFromAPI {

do {
try realm?.write {
realm?.add(item)
}
}
}

当从 API 收到已保存在数据库中的数据时,我需要更新它。据我了解,实现了主键

realm?.add(Item, update: .modified)

将更新具有相同主记录的现有记录。具有类 Item 的对象的属性已更新,但类别列表 <> 未更新。

我尝试获取保存在数据库中的现有类别列表,并通过调用 savedItem.categories.removeAll() 改变与 savedItem 关联的类别对象,并使用 savedItem.categories 添加新类别。追加(objectsIn:itemFromAPI.categories)当我用

保存它时
realm?.add(Item, update: .modified)

Realm 崩溃抛出异常 - “RLMException 原因:尝试创建具有现有主键值的类型的对象”

所以我尝试用

删除类别
realm?.delete(Category)

然后添加与 Item 关联的修改后的类别,这是有效的。

我已将类别嵌套到多个级别,并通过再次获取、删除和再次读取来更新它们,事实证明这很痛苦。这就是更新记录在 Realm 中的工作方式吗?

我可以通过简单地为项目分配新对象并使用

来更新与项目相关的嵌套类别吗
realm?.add(Item, update: .modified) 

要像添加新项目那样更新记录?

如有任何回应,我们将不胜感激。

最佳答案

根据评论,问题是

My question is how to update a Realm List property with realm?.add(Item, update: .modified) function.

为了清楚起见,让我重述一下问题

How to update an object stored in another objects List property where the stored objects in the list have a primary key

简短的回答是:List 对象保存对该列表中其他对象的引用。因为它包含引用,所以列表本身不需要更新,只需更新它引用的对象

长答案是通过一个例子:让我们以一个拥有 Dogs 的 List 属性的 Person 为例

class PersonClass: Object {
@objc dynamic var person_id = UUID().uuidString
let dogs = List<DogClass>()

override static func primaryKey() -> String? {
return "person_id"
}
}

class DogClass: Object {
@objc dynamic var dog_id = NSUUID().uuidString
@objc dynamic var dog_name = ""

override static func primaryKey() -> String? {
return "dog_id"
}
}

关键是 List 对象包含对存储在其中的对象的引用。它不“持有”那些实际的对象。如果列表中某个对象的属性发生变化,列表本身不受影响,并且仍然具有对该已更改对象的引用。

假设我们的人有两条狗。

let person = PersonClass()

let dog0 = DogClass()
dog0.dog_name = "Spot"
let dog1 = DogClass()
dog1.dog_name = "Rover"

person.dogs.append(objectsIn: [dog0, dog1])

try! realm.write {
realm.add(person)
}

所以现在人有两只狗; Spot 和 Rover。

假设我们想将 Rovers 的名字更改为 Lassie。无需更改或更新人员列表 - 只需更新 Realm 中的狗名称属性,确保我们使用相同的 dog_id,并且该更改将反射(reflect)在人员列表中。

let updatedDog = DogClass()
updatedDog.dog_id = "the dogs primary key"
updatedDog.dog_name = "Lassie"

try! realm.write {
realm.add(updatedDog, update: .modified)
}

关于ios - Realm iOS - 如何更新列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60532033/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com