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.

+3


source to share


2 answers


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
}

      

+9


source


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
}

      

}

+1


source







All Articles