2015-10-01 58 views
16

我已经在iOS中为领域对象设置了REST API。不过,我发现在我的对象中创建一个最喜欢的标志有问题。我创建了一个最喜欢的布尔,但是每次从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" 
    } 
} 

CreateOrUpdate

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


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

你是说你不想在Realm中保存'favorite'吗?如果是这样,那么当动态属性被保存在Realm中时,移除'dynamic'。 – Abhinav

+0

我的意思是'最喜欢'没有存储在远程数据库中,因此每次打开应用程序并添加新对象并根据主键'id'更新现有值时,它将设置最喜欢的值为默认值('false ')。我可以避免它更新为默认? –

+0

这很奇怪。我假定Realm中的'createOrUpdate'方法不会触及字典中未指定的属性。您能否将实际保存/更新API数据的示例代码添加到Realm中? – TiM

回答

15

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

1.使用一个被忽略的属性:

你可以告诉境界,某财产不应该被坚持。为了防止您的favorite财产将由领域就坚持你必须这样做:

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"] 
    } 
} 

,或者你可以

2.执行部分更新

或者你可以告诉境界明确哪些当您更新您的Pet对象时,应更新属性:

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

这种方式favorite属性不会被更改。

结论

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

忽略属性:境界无法存储favorite财产可言。你有责任跟踪他们。

部分更新:领域将存储'收藏'属性,但它不会被更新。

我想部分更新是你需要为你的目的。

+0

你节省我的时间...谢谢 –

15

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

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) 
} 
+1

我觉得这个选项比在接受的答案更可行。 –

+0

发现这是最好的工作解决方案。解决方案1不添加该对象,解决方案2看起来像一个混乱的工作。感谢这第三个选项! – SoundShock

+0

这应该是被接受的答案。 –

0

NSUserDefaults的4(或任何其它数据存储,真的)

我遇到了同样的问题,我选择了另一种更传统的方式将数据保存到另一个数据存储(NSUserDefaults)。就我而言,我存储了用户最后一次查看某个项目并将这些数据存储在NSUserDefaults中感觉合适。我不喜欢的东西如下:

首先,定义为您的存储对象的唯一密钥(self这里正在查看和渲染的模型对象):

- (NSString *)lastViewedDateKey { 
    // Note each item gets a unique key with <className>_<itemId> guaranteeing us uniqueness 
    return [NSString stringWithFormat:@"%@_%ld", self.class.className, (long)self.itemId]; 
} 

然后,当用户查看项,设置键:

- (void)setLastViewedToNow { 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setObject:[NSDate date] forKey:self.lastViewedDateKey]; 
    [userDefaults synchronize]; 
} 

后来,我用这样的:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
NSDate *createdOnDate = <passed in from elsewhere>; 
NSDate *lastViewedDate = [userDefaults objectForKey:self.lastViewedDateKey]; 
if (!lastViewedDate || [createdOnDate compare:lastViewedDate] == NSOrderedDescending) { 
    ... 
} 

与上述解决方案相反: 1.没有数据持久性。 2.这创造了另一个地方,人们必须定义对象的属性,并且如果每次添加新属性时都忘记更新此列表,则可能会导致错误。 3.如果您正在进行大批量更新,则通过每个对象返回都不是很实际,并且肯定会导致严重的后果。

我希望如果他们需要它,可以给别人一个选择。