2015-10-01 8 views
16

Я установил REST API для объекта realm в iOS. Однако я нашел проблему с созданием любимого флага в моем объекте. Я создал любимый 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" 
    } 
} 

CreateOrUpdate

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


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

Вы говорите, что не хотите сохранять «любимый» в Царстве? Если это так, удалите 'dynamic', так как динамические свойства сохраняются в Realm. – Abhinav

+0

Я говорю, что 'favorite' не хранится в удаленной базе данных, поэтому каждый раз открывайте приложение, добавляя новые объекты и обновляя существующие на основе первичного ключа' id', он установит для любимого значения значение по умолчанию ('false '). Могу ли я избежать его обновления до значения по умолчанию? –

+0

Это странно. Я бы предположил, что методы createOrUpdate в Realm не будут касаться свойств, которые не указаны в словаре. Можете ли вы указать пример кода, в котором вы фактически сохраняете/обновляете данные API в Realm? – TiM

ответ

15

Есть два способа решить эту проблему:

1. Используйте Игнорируется Свойство:

Вы можете сказать, что Realm некоторое свойство не должны сохраняться. Для того, чтобы не допустить, что ваше имущество favorite будет сохраняться на Realm вы должны сделать это:

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. Выполните частичное обновление

Или вы могли бы сказать Realm явно который свойства должны быть обновлены при обновлении вашего объекта Pet:

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

Таким образом, свойство favorite не будет изменено.

Заключение

Существует одна большая разница между этими двумя подходами:

Игнорируется недвижимость: Realm не будет хранить favorite собственности вообще. Вы несете ответственность за их отслеживание.

Частичное обновление: Realm сохранит свойство «Избранное», но оно не будет обновлено.

Я полагаю, что частичные обновления - это то, что вам нужно для вашей цели.

+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

4. NSUserDefaults (или любое другое хранилище данных, действительно)

Я столкнулся с той же проблемой, и я выбрал другую, более традиционную возможность сохранения вещей в другом хранилище данных (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. Если вы делаете большие обновления пакета, возврат к каждому объекту не очень практичен и, безусловно, вызовет боль в дороге.

Я надеюсь, что это даст кому-то другой вариант, если он в этом нуждается.

Смежные вопросы