首页 > 解决方案 > 使用 Nil 更新 Realm 对象不起作用

问题描述

如何用 nil 更新 Realm 对象?用户删除图像后图像恢复,并使用 Swift5 保存在应用程序上。当我尝试直接将“nil”设置为 Realm 对象以进行这样的调试时,对象值没有改变。

realm.beginWrite()
let m = realm.objects(Inventory.self).filter("id == %@", detailId as Any).first
m!.image = nil
try! realm.commitWrite()

// 库存.swift

class Inventory: Object {
@objc dynamic var number: Int = 1

//ID
@objc dynamic var id = 0

//Image
@objc dynamic private var imageData: Data? = nil 
dynamic private var _image: UIImage? = nil  

dynamic var image: UIImage? {
    set{
        self._image = newValue
        if let value = newValue {
            self.imageData = value.pngData() as Data?
        }
    }
    get{
        if let image = self._image {
            return image
        }
        if let data = self.imageData {
            self._image = UIImage(data: data as Data)
            return self._image
        }
        return nil
    }
} }

标签: swiftuiimagerealm

解决方案


问题中代码的问题是如何将 Inventory objects 图像属性设置为 nil。

当这件事发生时

m!.image = nil

它将非托管image属性设置为 nil

set {
   self._image = newValue
   if let value = newValue {
      self.imageData = value.pngData() as Data?
   }
}

但是正如你在 set 中的 if 语句中看到的那样,如果值为 nil,它会被忽略,所以self.imageData永远不会设置为 nil

有很多解决方案,但由于所有这些变量都是可选的,可能最简单的方法就是让它在集合中为零

set {
   self._image = newValue
   self.imageData = newValue.pngData() as Data?
}

编辑

以下是原始答案,但是一旦添加了更多数据,问题就不完整了。

只有可选属性可以设置为零。所以他们需要在领域中以一种特殊的方式定义,就像一个 String 对象

class Inventory: Object {
   @objc dynamic var id = ""
   @objc dynamic var imageName: String? = nil  //or NSData/Data
   //or for numbers, use this let value = RealmOptional<Int>()
   ...

然后将可选项设置为 nil 类似这样是一种安全的方法

let detailId = "some detail id"
if let item = realm.objects(Inventory.self).filter("id == %@", detailId).first {
    try! realm.write {
        item.imageName = nil
    }
} else {
  print("item not found")
}

推荐阅读