2017-04-25 16 views
7

Tôi đang cố gắng tìm hiểu cách sử dụng Realm Swift và Biểu đồ để cuối cùng tôi có thể sử dụng chúng trong cả ứng dụng tôi đang xây dựng và tôi đang có một thời gian tìm ra Vương quốc. Cuối cùng tôi đang lên kế hoạch để Charts nhìn vào Realm DB của tôi và sau đó hiển thị các biểu đồ dựa trên dữ liệu, nhưng trước khi tôi làm điều đó, tôi cần kiểm tra xem một đối tượng realm có tồn tại hay không, và sau đó khi người dùng sử dụng ứng dụng, hãy thêm 'đếm' vào bản ghi đó và cập nhật biểu đồ cho phù hợp.làm thế nào để cập nhật một đối tượng trong lĩnh vực nhanh chóng

Vì tôi đang học tôi đã chia nhỏ bước này thành các bước. Tôi đã tìm ra cách để kiểm tra xem nếu một bản ghi tồn tại và nếu không để xây dựng nó như thế này:

My Realm mẫu:

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

tôi đã xác minh rằng tác phẩm của ông qua Realm trình duyệt ứng dụng.

Tiếp theo trong danh sách Việc cần làm của tôi là tìm hiểu cách cập nhật hồ sơ cho "bản ghi ngày của ngày hôm nay". Để làm điều này tôi đã tạo ra một nút để khi khai thác nó sẽ cố gắng để làm điều này. Tôi đã googling và googling và đã đến để suy nghĩ kể từ khi tôi không sử dụng một khóa chính trong mô hình của tôi mà tôi phải đầu tiên xóa các hồ sơ cụ thể trong câu hỏi và sau đó thêm nó một lần nữa với các dữ liệu mới. Tôi không thể cho cuộc sống của tôi tìm ra cách để làm điều này dựa trên tài liệu Realm và thậm chí googling hơn. Đây là những gì tôi đã có, mặc dù nó không hoạt động:

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

Khi tôi bấm nút btnUpdate1MW tôi nhận được lỗi sau đây trong Xcode:

Chấm dứt ứng dụng do ngoại lệ còn tự do 'giá trị không hợp lệ ', lý do:' Đối tượng dự kiến ​​của loại ngày cho thuộc tính 'ngày' trên đối tượng thuộc loại 'WorkoutsCount', nhưng đã nhận: 2017-04-24 07:00:00 +0000 '

+0

Tại sao bạn không sử dụng khóa chính? Nó được thiết kế cho chính xác những tình huống này khi bạn muốn cập nhật một đối tượng hiện có. Đó là cách dễ dàng hơn để sử dụng hơn xóa và tái tạo một đối tượng và nó cũng là một giải pháp tối ưu hơn. –

+0

Bởi vì khi trở lại và thêm một khóa chính nó đã phá vỡ những gì tôi đã làm việc, lỗi tại dòng "let realm = try! Realm()" trong tập mã đầu tiên ở trên và tôi không thể tìm ra cách để khắc phục điều đó. Vì tôi mất một ngày để làm việc đó, tôi cảm thấy như đang lùi lại một bước. – jammyman34

+0

Bạn có thêm khối di chuyển vào phương thức AppDelegate, applicationDidFinishLaunching của mình không? Nếu không, đó là lý do tại sao bạn gặp lỗi và bạn sẽ gặp lỗi tương tự mỗi khi bạn thay đổi mô hình Realm của mình. –

Trả lời

20

Cập nhật các đối tượng chỉ được gán giá trị cho thuộc tính trong giao dịch ghi. Xem tài liệu của chúng tôi.

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

Vì vậy, bạn không cần xóa và sau đó thêm đối tượng. Chỉ cần gán giá trị mới cho thuộc tính trong giao dịch ghi như sau.

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: Vui lòng không sử dụng nội suy chuỗi trong truy vấn. Nói chung xây dựng một chuỗi quan trọng bằng nội suy chuỗi là thực hành không tốt. Sử dụng cú pháp thay thế chuỗi của NSPredicate như filter("date = %@", removeTodaysItem).

+0

là có một cách để thiết lập 'workouts' var để nó lọc với CONTAIN Tôi đã không thể tìm ra cú pháp đó vì tôi đã cố gắng làm việc với Predicates và tài liệu không rõ ràng để cho phép tôi tìm ra nó ...và tôi đã nhận thức được 'không sử dụng bit nội suy chuỗi' là tốt, nhưng tôi đã tuyệt vọng và đó là những ví dụ tôi đã tìm kiếm trực tuyến, nhưng cảm ơn cho làm rõ :) – jammyman34

Các vấn đề liên quan