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 '
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. –
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
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. –