16

I am a noob at core data, so here goes.

I have a core data object, for example student.

The student has mane attributes, like name, age, dob, address, and so on.

Now I need to display all these attributes into a table view.

Is there any easy way to iterate through the object student? Or do I have to convert the data into some type of dictionary?

If I need to convert it to a dictionary is there any support for it? Or do I have to write the function my self.

Many thanks for your help, Stephen

MPelletier
  • 16,256
  • 15
  • 86
  • 137
stephen
  • 1,617
  • 3
  • 20
  • 27

2 Answers2

26

Here's a very simple way to iterate over an NSManagedObject:

NSEntityDescription *entity = [myManagedObject entity];
NSDictionary *attributes = [entity attributesByName];
for (NSString *attribute in attributes) {
    id value = [myManagedObject valueForKey: attribute];
    NSLog(@"attribute %@ = %@", attribute, value);
}

The clues for how to do this (plus lots more) comes from Ole Bergmann's blog: http://oleb.net/blog/2011/05/inspecting-core-data-attributes/

mpemburn
  • 2,776
  • 1
  • 35
  • 41
20

If you are like me and are trying to solve this problem in Swift here is how I did it.

SWIFT 3:

let request:NSFetchRequest<ENTITY_NAME>
if #available(iOS 10.0, *){
    request = ENTITY_NAME.fetchRequest() as! NSFetchRequest<ENTITY_NAME>
}else{
    request = NSFetchRequest<ENTITY_NAME>(entityName: "ENTITY_NAME")
}

do{
    let entities = try YOUR_MOC.fetch(request)
    for item in entities{
        for key in item.entity.attributesByName.keys{
            let value: Any? = item.value(forKey: key)
            print("\(key) = \(value)")
        }
    }
}catch{

}

Swift 2:

   let request = NSFetchRequest(entityName: "ENTITY_NAME")
   do{
       let entities = try YOUR_MOC.executeFetchRequest(request) as! [YOUR_ENTITY]
       for item in entities{
           for key in item.entity.attributesByName.keys{
               let value: AnyObject? = item.valueForKey(key)
               print("\(key) = \(value)")
           }

       }
   }catch{

   }

If you want to get relationship entities key/values as well then you should use propertiesByName instead of attributesByName like so:

SWIFT 3:

for key in item.entity.propertiesByName.keys{
    let value: Any? = item.value(forKey: key)
    print("\(key) = \(value)")
}

SWIFT 2:

for key in item.entity.propertiesByName.keys{
    let value: AnyObject? = item.valueForKey(key)
    print("\(key) = \(value)")
}

Just remember to be careful with the value since it is an NSManagedObject.

boidkan
  • 4,691
  • 5
  • 29
  • 43