更新Object时防止Realm覆盖属性

Pet*_*Pik 22 realm ios swift

我在iOS中为realm对象设置了一个REST API.但是我发现在我的对象中创建一个喜欢的标志有一个问题.我已经创建了一个最喜欢的bool,但每次从API更新对象时,它都会将收藏夹设置为默认值false.在这里,我希望此标志不会更新,因为只有本地存储了收藏夹.我怎样才能做到这一点?

class Pet: Object{
    dynamic var id: Int = 1
    dynamic var title: String = ""
    dynamic var type: String = ""
    dynamic var favorite: Bool = false


    override class func primaryKey() -> String {
        return "id"
    }
}
Run Code Online (Sandbox Code Playgroud)

CreateOrUpdate

let pet = Pet()
pet.id = 2
pet.name = "Dog"
pet.type = "German Shephard"


try! realm.write {
    realm.add(pet, update: true)
}
Run Code Online (Sandbox Code Playgroud)

joe*_*ern 22

有两种方法可以解决这个问题:

1.使用忽略的属性:

您可以告诉Realm不应该保留某个属性.为了防止favoriteRealm持久保存您的财产,您必须这样做:

class Pet: Object{
    dynamic var id: Int = 1
    dynamic var title: String = ""
    dynamic var type: String = ""
    dynamic var favorite: Bool = false

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

    override static func ignoredProperties() -> [String] {
       return ["favorite"]
   }
}
Run Code Online (Sandbox Code Playgroud)

或者你可以

2.进行部分更新

或者,您可以在更新Pet对象时明确告诉Realm应更新哪些属性:

try! realm.write {
  realm.create(Pet.self, value: ["id": 2, "name": "Dog", "type": "German Shepard"], update: true)
}
Run Code Online (Sandbox Code Playgroud)

这样favorite财产不会改变.

结论

这两种方法有一个很大的区别:

忽略的属性: Realm根本不会存储该favorite属性.您有责任跟踪它们.

部分更新: Realm将存储'favorite'属性,但不会更新.

我想部分更新是您的目的所需要的.


Ada*_*ish 19

如果你想更明确,有第三种选择:

3.检索更新的当前值

// Using the add/update method
let pet = Pet()
pet.id = 2
pet.name = "Dog"
pet.type = "German Shephard"

if let currentObject = realm.object(ofType: Pet.self, forPrimaryKey: 2) {
    pet.favorite = currentObject.favorite
}

try! realm.write {
    realm.add(pet, update: true)
}

// Using the create/update method
var favorite = false
if let currentObject = realm.object(ofType: Pet.self, forPrimaryKey: 2) {
    favorite = currentObject.favorite
}

// Other properties on the pet, such as a list will remain unchanged
try! realm.write {
    realm.create(Pet.self, value: ["id": 2, "name": "Dog", "type": "German Shephard", "favorite": favorite], update: true)
}
Run Code Online (Sandbox Code Playgroud)

  • 我发现这个选项比接受的答案更可行. (2认同)
  • 内部物体如何实现这一点?例如,如果我使用列表保存对象并且必须拦截列表中每个对象的保存? (2认同)