【发布时间】:2014-10-25 15:15:42
【问题描述】:
我正在制作一个简单的班次跟踪器/工资计算器来练习 CoreData 和 Swift。我遇到了与此相关的不同任务的问题,因为我需要使用日期来:
- 显示它们
- 检查一周内的轮班数量,看看你是否应该得到额外的报酬(如果你一周工作超过 12 小时,挪威的规则会给你每小时 5/10 美元以上的额外报酬)
- 将一个月内的所有工资相加
- 如果用户输入错误,删除数据
可能还有更多我忘记了。
截至目前,我从日期选择器获取数据,这些数据选择器使用日期格式化程序将它们作为“fromDate”和“toDate”作为字符串添加到 DB。这导致我不得不使用一堆糟糕的代码。很大程度上是因为 NSDate 时区问题等。
我应该如何布置我的数据库以最有效地做到这一点?我应该为我需要的每种类型的数据创建一个字段吗? ('fromMinute'|'fromHour'|'fromDay'|'fromWeek'|'fromMonth'|'fromYear') 然后对应 'to' 字段?我是数据库的新手,但我认为我不应该拥有那么多领域。我应该有一个月表,然后是周表,然后使用关系(在这种情况下我该怎么做?)
我不能只使用时间间隔,因为奖金取决于时间间隔。
希望有人可以帮助我提出一些关于 CoreData 的推荐做法
更新:
这是我超级复杂的核心数据模型!
还有一个 NSManagedObject 类(我认为)
import UIKit
import CoreData
@objc(Shifts)
class Shifts: NSManagedObject {
@NSManaged var fromDate : String
@NSManaged var toDate : String
func getShift () -> Shift{
let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd w W HH:mm"
let from:NSDate = formatter.dateFromString(self.fromDate)!
let to:NSDate = formatter.dateFromString(self.toDate)!
let length:Double = to.timeIntervalSinceDate(from) as Double / 60
let newShift = Shift(from:from,to:to,length:length)
return newShift
}
}
Shit 是我的视图控制器中的一个类,用于显示等我的数据,它看起来像这样 (TW:Code Gore)
class Shift {
var fromDate : NSDate
var toDate : NSDate
var length : Double //In Minutes
var salary : Double = Double()
var UB : Bool = false
let etter18hverdag:Double = 22
let etter21hverdag:Double = 45
let helligdag:Double = 90
let helgEtter13:Double = 45
let helgEtter16:Double = 90 //HUSK AT PAUSE FINNES
init (from : NSDate, to : NSDate, length:Double){
self.fromDate = from
self.toDate = to
self.length = length
}
func calcSalary(ub: Bool)->Double{
let userDefaults:NSUserDefaults = NSUserDefaults.standardUserDefaults()
let hour: Double = userDefaults.doubleForKey("salary")
println("Checking salary on shift fromDate:\(fromDate) with length:\(length). Shift UB: \(UB)")
if (ub){
let calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
calendar.locale = NSLocale.systemLocale()
calendar.timeZone = NSTimeZone.localTimeZone()
var checkTime:NSDate = fromDate
var checkToTime:NSDate = toDate
var totalSalary:Double = Double()
while (checkToTime.timeIntervalSinceDate(checkTime)>0.0){
let split = calendar.components(NSCalendarUnit.WeekdayCalendarUnit | NSCalendarUnit.HourCalendarUnit, fromDate: checkTime)
println("Checking: \(checkTime) to: \(checkToTime) diff:\(checkToTime.timeIntervalSinceDate(checkTime)) currentSal: \(totalSalary) splitTime:\(split.hour)")
if(split.weekday==7){ //Søndag
let lønn = hour + helligdag
totalSalary += (lønn/4)
}
else if (split.weekday == 6){ //Lørdag
if(split.hour < 13){
let lønn = hour
totalSalary += (lønn/4)
}
if (split.hour>13 && split.hour<16){
let lønn = hour + helgEtter13
totalSalary += (lønn/4)
}
if (split.hour > 16){
let lønn = hour + helgEtter16
totalSalary += (lønn/4)
}
}
else if (split.weekday < 6){ //Hverdag
if(split.hour < 18){
let lønn = hour
totalSalary += (lønn/4)
}
if (split.hour>18 && split.hour<21){
let lønn = hour + etter18hverdag
totalSalary += (lønn/4)
}
if (split.hour > 21){
let lønn = hour + etter21hverdag
totalSalary += (lønn/4)
}
}
checkTime = checkTime.dateByAddingTimeInterval(15*60) //15 min ganger 60 sek i min
}
println("Calculated salary WITH UB: \(totalSalary)")
return totalSalary
} else {
let calendar : NSCalendar = NSCalendar(calendarIdentifier: NSGregorianCalendar)
calendar.locale = NSLocale.systemLocale()
calendar.timeZone = NSTimeZone.localTimeZone()
var checkTime:NSDate = fromDate
var totalSalary:Double = Double()
let multiple = (length/60)
while (self.toDate.timeIntervalSinceDate(checkTime)>0.0){
let lønn = hour
totalSalary += (lønn/4)
checkTime = checkTime.dateByAddingTimeInterval(15*60) //15 min ganger 60 sek i min
}
println("Calculated salary WITHOUT UB: \(totalSalary)")
return totalSalary
}
}
【问题讨论】:
-
为什么不直接使用 unix 时间戳呢?易于存储和计算。
-
@Oscar Apeland:你的问题对我来说不够清楚。我什至不知道您的核心数据模型是什么样的。你是什么实体,它们的属性和关系是什么?他们将帮助我们了解您对 NSDate 属性的需求...
-
@POB 我稍微更新了我的问题,看看。而且,据我所知,不可能将 NSData 存储在 coredata 中?
-
@Apfelsaft Apple Juice :D 需要详细说明吗?
标签: ios sql sqlite core-data swift