如何将包含其他结构体数组的结构体保存到Realm
解决结构体数组转Realm List对象的问题
我来帮你搞定这个数组转换的难题!其实核心就是把结构体数组里的每个元素逐个转换成对应的Realm对象,再添加到Realm的List集合里就行,下面一步步来:
第一步:确保Publisher实现完整的Persistable协议
你已经实现了从PublisherObject转Publisher的初始化方法,现在需要补上反向转换的managedObject()方法,这样每个Publisher结构体才能转成Realm能识别的PublisherObject:
extension Publisher: Persistable { // 你已经写过的从Realm对象转结构体的方法 public init(managedObject: PublisherObject) { identifier = managedObject.identifier name = managedObject.name } // 新增:结构体转Realm对象的方法 public func managedObject() -> PublisherObject { let publisherObj = PublisherObject() publisherObj.identifier = identifier publisherObj.name = name return publisherObj } }
第二步:完善Character的managedObject()方法处理数组
接下来就是处理publisherArray的转换了。Realm的List是专属集合类型,不能直接用数组的赋值方式,需要逐个添加元素。另外建议你把CharacterObject里的publisherArray改成非可选类型(Realm的List默认初始化就是空列表,没必要用可选):
先优化CharacterObject的定义:
final class CharacterObject: Object { dynamic var identifier = 0 dynamic var name = "" dynamic var realName = "" // 改成非可选的List,避免后续处理可选的麻烦 let publisherArray = List<PublisherObject>() override static func primaryKey() -> String? { return "identifier" } }
然后修改Character的managedObject()方法:
public func managedObject() -> CharacterObject { let character = CharacterObject() character.identifier = identifier character.name = name character.realName = realName // 遍历结构体数组,逐个转成Realm对象并添加到List中 publisherArray.forEach { publisher in character.publisherArray.append(publisher.managedObject()) } return character }
额外说明
因为你给PublisherObject设置了主键identifier,所以当你添加已存在主键的PublisherObject时,Realm会自动执行更新操作而不是重复创建,这也符合你基于主键做持久化的逻辑。
内容的提问来源于stack exchange,提问作者Michael Pohl
相关产品推荐
相关产品推荐

