2017-04-25 10 views
7

में किसी ऑब्जेक्ट को अपडेट करने का तरीका मैं रीयल स्विफ्ट और चार्ट्स का उपयोग करने के तरीके सीखने की कोशिश कर रहा हूं, इसलिए मैं अंत में उन दोनों ऐप में उनका उपयोग कर सकता हूं जिन्हें मैं बना रहा हूं और मुझे लगता है कि मुझे लगता है कि मुझे लगता है कि मुझे एक समय लगता है क्षेत्र। आखिरकार मैं चार्ट को अपने दायरे डीबी को देखने के लिए योजना बना रहा हूं और फिर डेटा के आधार पर चार्ट प्रदर्शित करता हूं, लेकिन इससे पहले कि मुझे यह देखने की ज़रूरत है कि एक वास्तविक वस्तु मौजूद है या नहीं, अगर ऐसा नहीं है, तो यह तब होता है जब उपयोगकर्ता ऐप का उपयोग उस रिकॉर्ड में 'मायने रखता है' जोड़ता है और तदनुसार चार्ट को अपडेट करता है।रीयल स्विफ्ट

जैसा कि मैं सीख रहा हूं मैंने इसे चरणों में तोड़ दिया है। मैं पहले से ही खोज निकाला है, तो एक रिकार्ड मौजूद है देखने के लिए जाँच करने के लिए कैसे और यदि नहीं इसे इस तरह का निर्माण करने के:

मेरे क्षेत्र मॉडल:

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

मैं सत्यापित किया है कि क्षेत्र ब्राउज़र के माध्यम से अपने कार्यों एप्लिकेशन।

मेरी टू-डू सूची पर अगला यह पता लगाने के लिए है कि "आज की तारीख के रिकॉर्ड" के लिए रिकॉर्ड कैसे अपडेट किया जाए। ऐसा करने के लिए मैंने एक बटन बनाया है, इसलिए जब इसे टैप किया जाए तो ऐसा करने का प्रयास किया जाएगा। मैं googling और googling गया है और सोचने के लिए आया है क्योंकि मैं अपने मॉडल में एक प्राथमिक कुंजी का उपयोग नहीं करता है कि मुझे पहले सवाल में विशिष्ट रिकॉर्ड को हटाना होगा और फिर इसे नए डेटा के साथ फिर से जोड़ना होगा। मैं अपने जीवन के लिए यह नहीं समझ सकता कि इसे रीयल प्रलेखन और यहां तक ​​कि अधिक googling के आधार पर यह कैसे करना है। यह मैं क्या मिल गया है, हालांकि यह काम नहीं करता:

न आया हुआ अपवाद के कारण एप्लिकेशन समाप्त 'अवैध मान:

@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") 
     } 
    } 

जब मैं btnUpdate1MW बटन मैं Xcode में निम्न त्रुटि प्राप्त नल ', कारण:' वर्कआउट्सउंट 'प्रकार की ऑब्जेक्ट पर प्रॉपर्टी' डेट 'के लिए टाइप डेट की अपेक्षित वस्तु, लेकिन प्राप्त: 2017-04-24 07:00:00 +0000'

+0

आप प्राथमिक कुंजी का उपयोग क्यों नहीं करते? जब आप मौजूदा ऑब्जेक्ट को अपडेट करना चाहते हैं तो यह बिल्कुल इन परिदृश्यों के लिए डिज़ाइन किया गया है। किसी ऑब्जेक्ट को हटाने और पुनर्निर्माण करने से उपयोग करना आसान है और यह एक और इष्टतम समाधान भी है। –

+0

क्योंकि जब वापस चला गया और प्राथमिक कुंजी जोड़ दी गई तो मैंने जो भी काम किया था, उसे तोड़ दिया, ऊपर दिए गए कोड के पहले सेट में "real real = try! Realm()" लाइन पर त्रुटि दें और मैं यह नहीं समझ सका इसे ठीक करने के लिए। चूंकि यह मुझे काम करने के लिए एक दिन लगा, ऐसा लगा कि मैं पीछे एक कदम उठा रहा था। – jammyman34

+0

क्या आपने अपने ऐपडिलेगेट, एप्लिकेशनडिडफिनिश लॉन्चिंग विधि में माइग्रेशन ब्लॉक जोड़ा था? यदि नहीं, तो यही कारण है कि आपको कोई त्रुटि क्यों मिली और जब भी आप अपना दायरे मॉडल बदलते हैं तो आपको वही त्रुटि मिल जाएगी। –

उत्तर

20

ऑब्जेक्ट अपडेट करना बस असाइन करना है एक लेखन लेनदेन के भीतर एक संपत्ति के लिए एक मूल्य। हमारे दस्तावेज देखें।

https://realm.io/docs/swift/latest/#updating-objects

तो आप हटाना और फिर एक वस्तु को जोड़ने की जरूरत नहीं है। बस लिखने वाले लेनदेन में संपत्ति के लिए नए मूल्य को निर्दिष्ट करें।

let workouts = realm.objects(WorkoutsCount.self).filter("date = %@", removeTodaysItem) 

let realm = try! Realm() 
if let workout = workouts.first { 
    try! realm.write { 
     workout.date = today 
     workout.count = plusOne 
    } 
} 

FYI: कृपया किसी क्वेरी में स्ट्रिंग इंटरपोलेशन का उपयोग न करें। आम तौर पर स्ट्रिंग इंटरपोलेशन द्वारा एक महत्वपूर्ण स्ट्रिंग का निर्माण करना बुरा अभ्यास है। filter("date = %@", removeTodaysItem) जैसे एनएसपीडिकेट के स्ट्रिंग विकल्प सिंटैक्स का उपयोग करें।

+0

'वर्कआउट्स' var सेट करने का कोई तरीका है, इसलिए यह एक CONTAIN के साथ फ़िल्टर करता है, मैं उस वाक्यविन्यास को समझने में सक्षम नहीं हूं क्योंकि मैं भविष्यवाणियों के साथ काम करने की कोशिश कर रहा हूं और दस्तावेज़ीकरण मुझे स्पष्ट करने के लिए स्पष्ट नहीं है इसे या तो समझें ...और मुझे पता था कि 'स्ट्रिंग इंटरपोलेशन' बिट का भी उपयोग न करें, लेकिन मैं बेहोश था और वे उदाहरण थे जिन्हें मैं ऑनलाइन ढूंढ रहा था, लेकिन स्पष्टीकरण के लिए धन्यवाद :) – jammyman34

संबंधित मुद्दे