我正在尝试学习如何使用Realm Swift和Charts,以便最终在我正在构建的应用程序中同时使用它们,但是我很难弄清楚Realm。最终,我计划让Charts查看我的Realm数据库,然后根据数据显示图表,但在此之前,我需要检查是否已经存在一个realm对象,如果不存在,则创建该对象,并在用户使用应用程序时向该记录添加“计数”,并相应地更新图表。
当我学习时,我已将其分解为步骤。我已经找出如何检查记录是否存在,如果不存在,则构建它,如下所示:
我的Realm模型:
当我点击btnUpdate1MW按钮时,Xcode会显示以下错误信息:
终止应用程序,原因是未捕获的异常“无效值”,原因是:“期望在类型为'WorkoutsCount'的对象上的属性'date'的类型为日期,但收到的是:2017-04-24 07:00:00 +0000”。
当我学习时,我已将其分解为步骤。我已经找出如何检查记录是否存在,如果不存在,则构建它,如下所示:
我的Realm模型:
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)
}
}
我已经通过 Realm Browser 应用程序验证了他的工作。
接下来在我的待办列表上是要找出如何更新“今天日期记录”的记录。为此,我创建了一个按钮,当点击它时,会尝试这样做。我一直在搜索和搜索,并且认为由于我在模型中没有使用主键,所以我必须先删除特定的记录,然后再添加新数据。基于 Realm 文档和更多的搜索,我无法弄清楚如何做到这一点。虽然这就是我得到的代码,但它并不起作用:
@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会显示以下错误信息:
终止应用程序,原因是未捕获的异常“无效值”,原因是:“期望在类型为'WorkoutsCount'的对象上的属性'date'的类型为日期,但收到的是:2017-04-24 07:00:00 +0000”。