2015-10-01 8 views
16

iOSでrealmオブジェクトにREST APIを設定しました。しかし、私は私のオブジェクトにお気に入りのフラグを作成することで問題を発見しました。私はお気に入りのブールを作成しましたが、オブジェクトがAPIから更新されるたびにお気に入りをデフォルトのfalseに再び設定します。お気に入りはローカルに保存されているので、このフラグは更新されません。どうすればこれを達成できますか?オブジェクトの更新時に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" 
    } 
} 

CreateOrUpdate

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


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

Realmに「お気に入り」を保存したくないと言っていますか?そうであれば、動的プロパティがRealmに保存されるので、 'dynamic'を削除してください。 – Abhinav

+0

「お気に入り」はリモートデータベースには格納されていないので、毎回アプリを開き、プライマリキー 'id'に基づいて新しいオブジェクトを追加し、既存のものを更新すると、お気に入りの値をデフォルトに設定します')。それがデフォルトに更新されないようにすることはできますか? –

+0

これは奇妙です。私は、Realmの 'createOrUpdate'メソッドが辞書に指定されていないプロパティに触れないと想定していました。 RealmにAPIデータを実際に保存/更新しているサンプルコードを含めてください。 – TiM

答えて

15

これを解決するには、2つの方法があります:あなたは、特定のプロパティというレルムを伝えることができ

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.部分更新を行うことを

それとも、レルムを明示的に伝えることができましたオブジェクトを更新するときにプロパティを更新する必要があります。

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

この方法でfavoriteプロパティは変更されません。

結論

2つのアプローチの一つの大きな違いがあります:

無視されたプロパティ:レルムは全く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は面倒な作業のようです。この3番目のオプションをありがとう! – 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]; 
} 

そして、ユーザが見るとき項目は、にキーを設定:

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

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

その後、私はこのようにそれを使用します上記のソリューションと対照的に: 1.データの永続性はありません。 2.これは、オブジェクトのプロパティを定義しなければならないさらに別の場所を作成し、新しいプロパティが追加されるたびにこのリストを更新することを忘れると、エラーにつながる可能性があります。 3.大きなバッチ更新を行っている場合は、すべてのオブジェクトを元に戻すことは実際的ではなく、確かに痛みの原因になります。

これが必要な場合、これは誰かに別のオプションを与えてくれることを願っています。