0

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 
} 

Antwort

0

Für das, was ich verstehe Sie Ihre Einträge sortieren mögen, basierend auf dem Datum, dass sie erstellt/gespeichert, wo eine Möglichkeit, dies zu tun könnte ein Zeitstempel-Attribut zu Ihrem Unternehmen hinzuzufügen und dieses Attribut bevölkert beim Speichern das Objekt. Verwenden Sie dann einen sortDescriptor, um die Datensätze, die Sie abrufen, basierend auf ihrem timestamp-Attribut zu sortieren. Etwas in der Form von:

let sortDescriptor = NSSortDescriptor(key: "savedTimestamp", ascending: true) 
let fetchRequest = NSFetchRequest(entityName: "myRecord") 
fetchRequest.sortDescriptors = [sortDescriptor] 
//- fetch records as you would 
var savedRecords: [myRecord]? 
do { 
    savedRecords = managedObjectContext.executeFetchRequest(fetchRequest) as? [myRecord] 
} catch { 
    print("the calamity!") 
} 

Hoffe, das hilft.

+0

Ich habe die Frage ein wenig mit einer neuen Richtung aktualisiert. Ich habe gelesen, dass Nsfetchcontroller ist, was ich verwenden sollte. – SashaZ

Verwandte Themen