Hallo Ich versuche, eine Tabelle für einen bestimmten Tag zu laden, dass die Daten in Kerndaten gespeichert wurden. Ich möchte, dass die Daten mit jedem Speichern als Abschnitt geladen werden. Es gibt viele verschiedene Messungen, die in Kerndaten gespeichert werden. Ich komme nicht sehr weit. Kannst du helfen?Swift Core Daten holen Ergebnisse nach Tag und sortieren in eine Tabellenansicht mit Zeitabschnitten
var totalEntries: Int = 0
var isPerformingSegue = false
var totalDates: Int = 0
var results: NSArray! = NSArray()
var appDel: AppDelegate!
var context: NSManagedObjectContext!
var request : NSFetchRequest!
override func viewDidLoad() {
super.viewDidLoad()
appDel = (UIApplication.sharedApplication().delegate as! AppDelegate)
context = appDel.managedObjectContext
loadTable()
}
func loadTable() {
let today = NSDate()
// get the current calendar
let calendar = NSCalendar.currentCalendar()
// get the start of the day of the selected date
let startDate = calendar.startOfDayForDate(today)
// get the start of the day after the selected date
let endDate = calendar.dateByAddingUnit(.Day, value: 1, toDate: startDate, options: NSCalendarOptions())!
request.returnsObjectsAsFaults = false
let dateFormatter = NSDateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm"
dateFormatter.timeZone = NSTimeZone(name: "GMT") // this line resolved me the issue of getting one day less than the selected date
totalEntries = context.countForFetchRequest(request, error: nil) as Int!
request.predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", startDate, endDate)
request.sortDescriptors = [NSSortDescriptor(key: "report_id", ascending: false)]
do {
var results : NSArray = try context.executeFetchRequest(request)
} catch {
// Report any error we got.
}
}
// MARK: - Table view data source
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return results.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell: ResultTableViewCell = tableView.dequeueReusableCellWithIdentifier("resultCell") as! ResultTableViewCell
//get contents and put into cell
let OurData = results[indexPath.row] as! NSManagedObject
if indexPath.row == 0 {
let colourLevel: Int = ((OurData.valueForKey("colourLevel"))?.integerValue)!
cell.resultLabel.textColor = UIColor.whiteColor()
cell.resultLabel.text = "Colour of Bowel Movement"
cell.backgroundColor = GlobalColourConstants.colourColourArray[(colourLevel - 1)]
return cell
} else if indexPath.row == 1 {
let bmLevel: Int = ((OurData.valueForKey("bMLevel"))?.integerValue)!
cell.resultLabel.text = GlobalPhrazesConstants.GlobalPhrazesStrings.bMPhrazeArray[bmLevel]
cell.resultLabel.textColor = UIColor.whiteColor()
let imageName = GlobalUIImageConstants.bMImageArray[bmLevel]
let image = UIImage(named: imageName)
cell.resultIconImageView.image = image
cell.backgroundColor = GlobalColourConstants.bMColourArray[bmLevel]
return cell
} else {
return cell
}
}
Ich habe die Methode wie unten beschrieben und näher gekommen. Jetzt kann ich nach Tagen sortieren und nach Zeitabschnitten sortieren. Allerdings kann ich nicht mehr als eine Zeile anzeigen lassen (es sollte viel mehr als eine Zeile geben).
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext
var fetchedResultController: NSFetchedResultsController = NSFetchedResultsController()
override func viewDidLoad() {
super.viewDidLoad()
// core data
fetchedResultController = getFetchedResultController()
fetchedResultController.delegate = self
do {
try fetchedResultController.performFetch()
} catch _ {
}
}
// MARK:- Retrieve Tasks
func getFetchedResultController() -> NSFetchedResultsController {
fetchedResultController = NSFetchedResultsController(fetchRequest: taskFetchRequest(), managedObjectContext: managedObjectContext, sectionNameKeyPath: "savedTimeHourMinute", cacheName: nil)
return fetchedResultController
}
func taskFetchRequest() -> NSFetchRequest {
let fetchRequest = NSFetchRequest(entityName: "UserData")
let sortDescriptor = NSSortDescriptor(key: "savedTimeMonthDay", ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
return fetchRequest
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
if let sections = fetchedResultController.sections {
return sections.count
}
return 0
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if let sections = fetchedResultController.sections {
let currentSection = sections[section]
return currentSection.numberOfObjects
}
return 0
}
Ich habe die Frage ein wenig mit einer neuen Richtung aktualisiert. Ich habe gelesen, dass Nsfetchcontroller ist, was ich verwenden sollte. – SashaZ