0
こんにちは、データがコアデータに保存されている特定の日にテーブルをロードしようとしています。セクションごとにセーブするたびにデータをロードしたい。コアデータに保存されるさまざまな測定値があります。私は非常に遠くになっていません。手伝ってくれますか?Swift Coreのデータを1日ごとにフェッチし、時間のセクションを含むテーブルビューにソートする
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
}
質問を少し新しい方向に更新しました。私はNsfetchcontrollerが私が使用すべきものだと読んでいます。 – SashaZ