我正在做一個簡單的班次跟蹤器/薪水計算器來練習CoreData和Swift。我在與此相關的不同任務的問題,因爲我需要使用日期:CoreData存儲日期推薦做法
- 顯示他們
- 轉變的檢查量在一週內看到,如果你應得加班工資(挪威規則給你5/10 $ +每小時額外的,如果你在一個月的工作,每週不超過12小時)
- 將所有工資一起
- 刪除的數據,如果在錯誤的
,可能更多的用戶類型我忘了。
從現在開始,我從日期選擇器獲取數據,它使用日期格式化程序將它們作爲字符串從「fromDate」和「toDate」添加到DB中。這導致我不得不使用一堆不好的代碼。很大程度上是因爲NSDate時區問題等。
我應該如何佈置我的數據庫來最有效地做到這一點?我應該爲每種類型的數據創建一個字段嗎? ('fromMinute'|'fromHour'|'fromDay'|'fromWeek'|'fromMonth'|'fromYear'),然後對應'to'字段?我是數據庫的新手,但我認爲我不應該擁有那麼多的領域。我應該有一個月表,然後是一個星期表,然後使用關係(在那種情況下,我該怎麼做?)
我不能只使用一個時間間隔,因爲獎金取決於它有多晚。
希望有人能幫助我與一些推薦的做法在CoreData
UPDATE:
這裏是我的超級複雜的核心數據模型!
用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
}
}
媽是一類我在我的視圖控制器,我用它來顯示等我的數據,它看起來像這樣(TW:代碼戈爾)
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時間戳?易於存儲,易於計算。 – Apfelsaft 2014-09-01 12:31:00
@Oscar Apeland:你的問題對我來說還不夠清楚。我甚至不知道你的核心數據模型是什麼樣子。你是什麼實體,它們的屬性和關係是什麼?他們將幫助我們瞭解您對NSDate屬性的需求...... – 2014-09-01 17:21:35
@POB我更新了一下我的問題,看看。而且,據我所見,它不可能將NSData存儲在coredata中? – 2014-09-02 12:04:15