Swift Core 数据按天获取结果并排序到带有时间部分的表格 View 中

标签 swift uitableview core-data nspredicate nsfetchedresultscontroller

您好,我正在尝试加载数据保存到核心数据的特定日期的表。我希望每次保存时都加载数据作为一个部分。有许多不同的测量值保存到核心数据中。我还没有走多远。你能帮忙吗?

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
 }
}

我已经取消了以下方法的日期,并且已经接近了。现在我可以按天数据排序并按时间分段排序。但是,我无法显示多于一行(应该多于一行)。

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
}

最佳答案

据我了解,您希望根据创建/保存的日期对条目进行排序,执行此操作的一种方法可能是向您的实体添加时间戳属性,并在保存对象时填充此属性。然后,使用 sortDescriptor 根据时间戳属性对您获取的记录进行排序。大致如下:

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!")
}

希望这有帮助。

关于Swift Core 数据按天获取结果并排序到带有时间部分的表格 View 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36236425/

相关文章:

ios - 核心数据精确存储 NSDecimalNumber

swift - 使用多边形三角剖分创建自定义几何体并在 SceneKit 中应用纹理坐标

core-data - 'AnyObject' 没有名为 'contactName' 的成员阻止我的循环

core-data - CoreData : fetch only last elements, 并非全部 (iPhone)

swift - 如何将自定义单元格添加到动态生成的 TableView ?

swift - 滚动 TableView 时,我需要在 TableView 最顶部传递的行

ios - 如何将 UITableViewCell 中 textField 的值获取到 textFieldDelegate 方法 shouldChangeCharactersIn 中?

ios - SwiftUI 图表 : Adding Label To Bar Chart Bar

ios - 自动布局将标签对齐到 View 的左侧

ios - 在 iOS 上存储很少更新的数据