Splitting tableView and rows with Core Data Swift
I have two tables in sqlite:
The code was generated by the Xcode generation:
class Event: NSManagedObject {
@NSManaged var startDate: NSDate
@NSManaged var details: EventDetail //i think this property shoud be var details Array<EventDetail> am i correct?
}
class EventDetail: NSManagedObject {
@NSManaged var title: String
@NSManaged var location: String
@NSManaged var note: String
@NSManaged var endDate: NSDate
@NSManaged var event: NSManagedObject
}
I want to put events in a section and eventDetails in rows .
I created a method to load events:
var eventList : Array<AnyObject> = []
func loadEvents(){
let appDel : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let moc: NSManagedObjectContext = appDel.managedObjectContext!
let eventMO = NSFetchRequest(entityName: "Event")
eventMO.returnsObjectsAsFaults = false
var err : NSErrorPointer = nil
eventList = moc.executeFetchRequest(eventMO, error: err)!
self.tblEvento.reloadData()
}
func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
return eventList.count
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//return (eventList[section] as Event).details.count
return //????? what can i put here
}
I don't know what I can add to the numbertOfRowsInSection method to determine the number of rows a section has. Because I can't access details.count or something like it.
I think there is another way to do it. I've seen something like using NSFetchedResultsController but no success.
I would help a little.
source to share
Just a hint: if you are using CoreData and UiTableView use NSFetchedResultsController to make things a lot easier. If you're looking for a starting point and sample code - just create a new project-project-app-app-app in Xcode and enable "Use master data" in the dialog.
Now straight to your question, an example of an "implementation" of NSFetchResultsController:
var fetchedResultsController: NSFetchedResultsController {
if _fetchedResultsController != nil {
return _fetchedResultsController!
}
let fetchRequest = NSFetchRequest()
// Edit the entity name as appropriate.
let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext: self.managedObjectContext!)
fetchRequest.entity = entity
// Set the batch size to a suitable number.
fetchRequest.fetchBatchSize = 20
// Edit the sort key as appropriate.
let sectionSortDescriptor = NSSortDescriptor(key: "startDate", ascending: true)
let secondSortDescriptor = NSSortDescriptor(key: "title", ascending: true)
let sortDescriptors = [sectionSortDescriptor, secondSortDescriptor]
fetchRequest.sortDescriptors = sortDescriptors
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: "startDate", cacheName: nil)
aFetchedResultsController.delegate = self
_fetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !_fetchedResultsController!.performFetch(&error) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
//println("Unresolved error \(error), \(error.userInfo)")
abort()
}
return _fetchedResultsController!
}
// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return self.fetchedResultsController.sections?.count ?? 0
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionInfo = self.fetchedResultsController.sections![section] as NSFetchedResultsSectionInfo
return sectionInfo.numberOfObjects
}
source to share
As per the cross code answer!
I've made some changes!
1 - I needed to implement the NSFetchedResultsControllerDelegate protocol;
2 - I needed to declare fechedResultsController
3 - I needed to set the correct table in entity for NSEntityDescription;
4 - I needed to navigate through the group using startdate in sectionNameKeyPath
Now the code:
//1 - implementing protocol
class AgendaViewController: UIViewController, UITableViewDelegate,
UITableViewDataSource, NSFetchedResultsControllerDelegate{
//2 - declare the fechedResultsController
var fetchedResultsController: NSFetchedResultsController = NSFetchedResultsController()
override func viewDidLoad() {
super.viewDidLoad()
getFetchedResultController()
}
func getFetchedResultController(){
let appDel : AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let moc: NSManagedObjectContext = appDel.managedObjectContext!
let fetchRequest = NSFetchRequest()
//3 - set the correct table
let entity = NSEntityDescription.entityForName("EventDetail", inManagedObjectContext: moc)
fetchRequest.entity = entity
fetchRequest.fetchBatchSize = 20
let sectionSortDescriptor = NSSortDescriptor(key: "event.startDate", ascending: true)
let sortDescriptors = [sectionSortDescriptor] //, secondSortDescriptor]
fetchRequest.sortDescriptors = sortDescriptors
//4 - navigate in relationship to group by startdate
let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: moc, sectionNameKeyPath: "event.startDate", cacheName: nil)
aFetchedResultsController.delegate = self
self.fetchedResultsController = aFetchedResultsController
var error: NSError? = nil
if !self.fetchedResultsController.performFetch(&error) {
abort()
}
}
func numberOfSectionsInTableView(tableView: UITableView!) -> Int {
return self.fetchedResultsController.sections?.count ?? 0
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let sectionInfo = self.fetchedResultsController.sections![section] as NSFetchedResultsSectionInfo
return sectionInfo.numberOfObjects
}
}
source to share