使用 Nil 更新 Realm 对象不起作用
Updating Realm object with Nil not working
如何用 nil 更新 Realm 对象?用户删除图片后图片恢复,用Swift5保存在app上。当我尝试将 'nil' 直接设置为 Realm 对象以进行调试时,对象值没有改变。
realm.beginWrite()
let m = realm.objects(Inventory.self).filter("id == %@", detailId as Any).first
m!.image = nil
try! realm.commitWrite()
// Inventory.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 对象图像 属性 设置为 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
有很多解决方案,但由于所有这些变量都是可选的,可能最简单的就是让它在集合中为 nil
set {
self._image = newValue
self.imageData = newValue.pngData() as Data?
}
编辑
以下是原始答案,但添加了更多数据后问题仍未完成。
只能将可选属性设置为 nil。所以它们需要在领域中以特殊的方式定义,就像这样对于 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")
}
如何用 nil 更新 Realm 对象?用户删除图片后图片恢复,用Swift5保存在app上。当我尝试将 'nil' 直接设置为 Realm 对象以进行调试时,对象值没有改变。
realm.beginWrite()
let m = realm.objects(Inventory.self).filter("id == %@", detailId as Any).first
m!.image = nil
try! realm.commitWrite()
// Inventory.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 对象图像 属性 设置为 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
有很多解决方案,但由于所有这些变量都是可选的,可能最简单的就是让它在集合中为 nil
set {
self._image = newValue
self.imageData = newValue.pngData() as Data?
}
编辑
以下是原始答案,但添加了更多数据后问题仍未完成。
只能将可选属性设置为 nil。所以它们需要在领域中以特殊的方式定义,就像这样对于 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")
}