I try to pull out data from CoreData with the following code
NSFetchRequest *request = [[NSFetchRequest alloc] init]; request.entity = [NSEntityDescription entityForName:@"Cave" inManagedObjectContext:self.context]; request.predicate = [NSPredicate predicateWithFormat:@"(latitude > 0) AND (longitude > 0)"]; NSError *error; NSLog(@"%@",[self.context executeFetchRequest:request error:&error]); NSLog(@"%@",[error localizedDescription]);
CoreData should have 9 matching objects and it finds the 9 objects. So the predicate should work but I get this in the console
2011-09-05 07:41:42.267 CaveConditions[6930:11903] ( "<NSManagedObject: 0x7368060> (entity: Cave; id: 0x7367880 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p31> ; data: <fault>)", "<NSManagedObject: 0x73547e0> (entity: Cave; id: 0x7356e20 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p40> ; data: <fault>)", "<NSManagedObject: 0x73681e0> (entity: Cave; id: 0x7363e60 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p42> ; data: <fault>)", "<NSManagedObject: 0x7368280> (entity: Cave; id: 0x7356be0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p72> ; data: <fault>)", "<NSManagedObject: 0x7368320> (entity: Cave; id: 0x733ad80 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p73> ; data: <fault>)", "<NSManagedObject: 0x73683c0> (entity: Cave; id: 0x7333e70 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p91> ; data: <fault>)", "<NSManagedObject: 0x7368480> (entity: Cave; id: 0x7361810 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p101> ; data: <fault>)", "<NSManagedObject: 0x7368570> (entity: Cave; id: 0x7360110 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p105> ; data: <fault>)", "<NSManagedObject: 0x7368610> (entity: Cave; id: 0x73303c0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p112> ; data: <fault>)" )
It used to work prefectly fine until I did the following change in Cave.m which is the Entity
I added MKAnnotation as a delegate in Cave.h and added this code in Cave.m
- (CLLocationCoordinate2D)coordinate { CLLocationCoordinate2D location; location.latitude = [self.latitude doubleValue]; location.longitude = [self.longitude doubleValue]; return location; }
Is there a way to debug this?
In Core Data, faults are placeholders, or “unrealized objects”. They are small objects which refer to other NSManagedObjects, which are fetched into memory only as needed. This faulting mechanism is designed to enhance performance and reduce memory use.
One approach to delete everything and reset Core Data is to destroy the persistent store. Deleting and re-creating the persistent store will delete all objects in Core Data.
Faulting reduces your application's memory usage by keeping placeholder objects (faults) in the persistent store. A related feature called uniquing ensures that, in a given managed object context, you never have more than one managed object to represent a given record.
The next time you need to store data, you should have a better idea of your options. Core Data is unnecessary for random pieces of unrelated data, but it's a perfect fit for a large, relational data set. The defaults system is ideal for small, random pieces of unrelated data, such as settings or the user's preferences.
This is expected behaviour, core data won't return full objects until you need to access the persistent values of the objects. Each of your returned objects will be a 'fault' until this point.
You can force the fetch request to return full objects using [request setReturnsObjectsAsFaults:NO]
, but in most cases what you have will be fine. Look at the documentation for NSFetchRequest for more information.
If you access one of the properties, core data will go to the persistent store and fetch the rest of your values, then you'll get the full description in the logs.
This seems to be such a common misunderstanding that I decided to write about it, here.
I faced the same problem while pulling data from CoreData ! So, I followed the way @jrturton instructed and implemented it in Swift 3:
Step 1 : Add
import CoreData
Step 2 : Add the code below . .
let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext var request = NSFetchRequest<NSFetchRequestResult>() request = Your_Entity_Name.fetchRequest() request.returnsObjectsAsFaults = false do { let arrayOfData = try context.fetch(request) } catch { // Handle the error! }
Hope , it will help you . :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With