swift - 使用 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
}
} }
解决方案
问题中代码的问题是如何将 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")
}
推荐阅读
- javascript - mongoose.model 在开玩笑测试后留下打开的句柄
- javascript - 解决跨域限制
- python - Seaborn 条形图中 X 轴上的排序和格式化日期
- lua - 从 LUA 中的 URL 派生主机
- c# - WebClient DownloadData - System.ArgumentException:路径不是合法形式
- javascript - Alexa如何实现意图确认?
- ios - UIStatusBarStyle lightContent 在模态呈现的视图控制器上没有得到尊重
- jquery - json 通过 url 而不是通过 jquery 返回
- json - 如何在jsonapi中表示一个表结构
- ios - Xcode Objective C:手势后在工具栏中锁定风景