2016-04-11 8 views
0

Ich benutze Realm in meinem schnellen Projekt.Modellstatus zwischen viewControllern mit Realm speichern - es bricht die Beziehung

Hier sind meine Objekte, Essen und Reaktion - mit einer Abbildung eines zu viele:

enum DishType: String{ 
    case Breakfast 
    case Second_breakfast 
    case Brunch 
    case Elevenses 
    case Lunch 
    case Tea 
    case Dinner 
    case Supper 
    case Snack 
} 

class Meal : Object{ 
    dynamic var date: NSDate = NSDate() 
    dynamic var dishType = DishType.Breakfast.rawValue 

    var dishTypeEnum: DishType{ 
    get{ 
     return DishType(rawValue: dishType)! 
    } 
    set{ 
     dishType = newValue.rawValue 
    } 
    } 

    dynamic var foodItems: String = "" 
    var reactions = List<Reaction>() 
} 


enum Category: String{ 
    case Apetit 
    case Energy 
    case Emotion 
} 

enum Type: String{ 
    case Positive 
    case Negative 
} 

class Reaction: Object{ 

    dynamic var category = Category.Apetit.rawValue 
    dynamic var text: String? 
    dynamic var selected: Bool = false 
    dynamic var type = Type.Positive.rawValue 
    ..... 
} 

I-Zustand von einem Viewcontroller zum anderen sparen müssen. Ich wähle einige Reaktionen aus, die ich sehen muss, wenn ich zum Reaktionsbildschirm zurückkehre.

saving Reaction state

Ich dachte in Realm zu speichern, aber ich muss auch alle Reaktionen Zustand löschen, wenn eine neue Reihe von Daten eingeben. Beim Löschen von Reaktion scheint es, dass es auch die Beziehung bricht. Ich habe Meal-Objekte gespeichert (die auch eine Beziehung mit Reaction haben).

Ich weiß nicht, wie man zwischen Reaktionen, die den Zustand anzeigen, und denen, die in Beziehung stehen, von einer gespeicherten Mahlzeit unterscheidet.

Ich dachte sparen Reaktionen für den Staat, nur in NSUserDefaults. Aber so werde ich beide Frameworks kombinieren.

Was denken Sie? Wie retten Sie den Staat?

Antwort

2

Ich dachte, Speichern in Realm, aber ich muss auch alle Reaktionen Zustand bei der Eingabe einer neuen Reihe von Daten zu löschen. Beim Löschen von Reaction scheint es auch die Relation zu unterbrechen. Ich habe Meal-Objekte gespeichert (die auch eine Beziehung mit Reaction haben).

Wenn Sie die Änderungen an den Reaction Objekten vornehmen, werden diese Änderungen angezeigt, wo immer die Reaktionen verknüpft sind. Daher möchten Sie wahrscheinlich keine Änderungen daran vornehmen, es sei denn, es handelt sich um eine Neuformulierung. (z. B. einen Tippfehler korrigieren "Du willst keine Wüste" => "Du willst kein Dessert") Auch wenn du sie löschst, werden sie auch von Meal Objekten gelöscht, mit denen sie verlinkt wurden.

Ich dachte sparen Reaktionen für den Staat, nur in NSUserDefaults. Aber so werde ich beide Frameworks kombinieren.

Das ist nicht notwendig. Sie können Ihren Anwendungsfall vollständig mithilfe von Realm lösen.

Die Lösung ist, dass Sie kein Attribut selected in Reaction enthalten. Stattdessen fügen Sie einfach die ausgewählten Reaktionen zu Meal hinzu. In Ihrem View-Controller heißt das, dass Sie für jede Reaction eine Zelle rendern, indem Sie alle mit let reactions = realm.objects(Reaction) abfragen.

Sie können dann herausfinden, ob Sie das Häkchen hinzufügen müssen, indem geprüft wird, ob sie in der Meal ‚s Reaktionen wie diese sind enthalten:

meal.reactions.contains(reaction) 

Wenn eine Reaktion für eine Mahlzeit ausgewählt ist, die Sie hinzufügen es zum Essen:

meal.reactions.add(reactions[indexPath.row]) 

Wenn eine Reaktion abgewählt wird, können Sie es von der Mahlzeit entfernen:

meal.reactions.removeAtIndex(meal.reactions.indexOf(reactions[indexPath.row])) 
+0

Ich mag deine elegante Lösung. Wann sollte ich jedoch alle Reactions zu Realm hinzufügen, damit ich diese für meinen Viewcontroller bereithalten kann? –

+0

Woher kommen sie? Ich denke, sie sollten schon beim ersten Start der App da sein. Sie könnten ein separates Ziel erstellen, das die Realm-Datenbank einrichtet und alle Reaktionen erstellt und diese Datenbank zurück in Ihr Projekt kopiert. Sie können dann die .realm-Datei zu Ihrem Projekt hinzufügen und beim ersten Start sicherstellen, dass diese Datei aus dem App-Bundle in das Benutzerdatenverzeichnis kopiert wird. ('Realm.Configuration.defaultConfiguration.path') – marius

+0

Ok, ich versuche deine Vorschläge. Vielen Dank! –

Verwandte Themen