comment mettre à jour un objet dans domaine swift

Je suis en train d'apprendre comment utiliser le Domaine de Swift et des Graphiques afin que je puisse éventuellement les utiliser dans une application que je suis en train de construire et je vais avoir un sacré bout de temps à essayer de comprendre Royaume. Finalement, je prévois d'avoir des Cartes marines à regarder mon Royaume DB et ensuite afficher les diagrammes basés sur les données, mais avant que je le fais que j'ai besoin de vérifier pour voir si un domaine d'objet existe encore, s'il ne le fait pas, le créer et ensuite que l'utilisateur utilise l'application ajouter "compte" pour que, enregistrer et mettre à jour le tableau en conséquence.

Que j'apprends que j'ai cassé ce en plusieurs étapes. Je l'ai déjà compris comment vérifier si un enregistrement existe et si ne pas le construire comme ceci:

Mon Royaume, Modèle:

class WorkoutsCount: Object{    
dynamic var date: Date = Date()
dynamic var count: Int = Int(0)
}
//function to check if this weeks days have been created in Realm DB yet and creates them if not
    let realm = try! Realm()
lazy var workouts: Results<WorkoutsCount> = { self.realm.objects(WorkoutsCount.self)}()
let startOfWeekDate = Date().startOfWeek(weekday: 1)
let nextDay = 24 * 60 * 60
//checks the DB to see if it contains the start of this week
    func searchForDB(findDate: Date) -> WorkoutsCount?{
let predicate = NSPredicate(format: "date = %@", findDate as CVarArg)
let dateObject = self.realm.objects(WorkoutsCount.self).filter(predicate).first
if dateObject?.date == findDate{
return dateObject
}
return nil
}
func setThisWeeksDays(){
//if the beginning of this week doesn't exist in the DB then create each day with 0's as the count data
        if searchForDB(findDate: startOfWeekDate) == nil{
try! realm.write() {
let defaultWorkoutDates = [startOfWeekDate, startOfWeekDate + TimeInterval(nextDay), startOfWeekDate + TimeInterval(nextDay*2), startOfWeekDate + TimeInterval(nextDay*3), startOfWeekDate + TimeInterval(nextDay*4), startOfWeekDate + TimeInterval(nextDay*5), startOfWeekDate + TimeInterval(nextDay*6)]
for workouts in defaultWorkoutDates {
let newWorkoutDate = WorkoutsCount()
newWorkoutDate.date = workouts
self.realm.add(newWorkoutDate)
}
}            
workouts = realm.objects(WorkoutsCount.self)
}
}

J'ai vérifié que sa fonctionne via le Royaume de l'application Navigateur.

Le prochain sur ma liste À Faire est de comprendre comment mettre à jour un enregistrement pour "aujourd'hui la date de l'enregistrement". Pour ce faire j'ai créé un bouton lorsque l'utilisateur appuie dessus, il allait tenter de le faire. J'ai cherché sur google et sur google et en viens à penser depuis que je ne pas utiliser une clé primaire dans mon Modèle que j'ai d'abord supprimer le dossier en question, puis l'ajouter à nouveau avec les nouvelles données. Je ne peux pas pour la vie de me comprendre comment le faire en se fondant sur le Domaine de la documentation et même plus d'une recherche sur google. C'est ce que j'ai, mais il ne fonctionne pas:

@IBAction func btnUpdate1MW(_ sender: Any) {
if searchForDB(findDate: today) != nil{
if plusOne <= 7{
plusOne += 1
CounterImage1MW.image = UIImage(named:  "1MWs-done-\(plusOne)")
let realm:Realm = try! Realm()
//deletes the original item prior to being updated and added back below
                let removeTodaysItem = today
let workout = realm.objects(WorkoutsCount.self).filter("date = '\(removeTodaysItem)'")
if workout.count > 0{
for date in workout{
try! realm.write {
realm.delete(date)
}
}
}
//adds back the item with an updated count
                do {
let realm = try Realm()
try realm.write {
realm.create(WorkoutsCount.self, value: ["date": today, "count": plusOne], update: false)
}
} catch let error as NSError {
fatalError(error.localizedDescription)
}
}
print("add to 1MW + 1")
}
}

Quand je tape sur le btnUpdate1MW bouton j'obtiens l'erreur suivante dans Xcode:

Résiliation d'application en raison de uncaught exception 'valeur non Valide', la raison: on Attend un objet de type date pour la propriété "date" sur l'objet de type "WorkoutsCount', mais il a reçu: 2017-04-24 07:00:00 +0000'

Pourquoi vous n'utilisez pas une clé primaire? Il est conçu précisément pour ces scénarios lorsque vous souhaitez mettre à jour un objet existant. Il est beaucoup plus facile à utiliser que de le supprimer et de recréer un objet et c'est aussi un plus solution optimale.
Parce que quand suis retourné et a ajouté une clé primaire, il a rompu ce que j'avais déjà eu de travail, d'erreur à la "je realm = essayer! Royaume (le)" ligne de la première série de code ci-dessus et je ne pouvais pas comprendre comment résoudre ce problème. Depuis il m'a fallu une journée pour obtenir que le travail c'était comme si je prenais un pas en arrière.
Avez-vous d'ajouter une migration bloc à votre AppDelegate, applicationDidFinishLaunching méthode? Si non, c'était la raison pour laquelle vous avez obtenu une erreur et vous obtiendrez la même erreur à chaque fois que vous modifiez votre Royaume modèles.

OriginalL'auteur jammyman34 | 2017-04-25