I have nine Aviso elements in a NSMutableArray
and I am theoretically storing these nine elements in the Core Data of my application. The problem is that when trying to retrieve from the data base these elements with NSFetchRequest
, I only get eight null elements and the last element appears correctly.
This is how my data model looks like:
And the Aviso entity is related to the Aviso NSManagedObject
:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface Aviso : NSManagedObject{
NSDate * date;
NSString * text;
NSString * idwarning;
}
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) NSString * text;
@property (nonatomic, retain) NSString * idwarning;
@end
In the viewDidLoad
of my WarningController
class I first load my warnings:
for(Aviso * a in warnings)
{
[self saveObjectcdata:a];
}
[self loadxcdata];
saveObjectcdata is:
-(void) saveObjectcdata:(Aviso * )aux
{
NSManagedObject *object = [NSEntityDescription insertNewObjectForEntityForName:@"Aviso" inManagedObjectContext:self.managedObjectContext];
[object setValue:aux.idwarning forKey:@"idwarning"];
[object setValue:aux.date forKey:@"date"];
[object setValue:aux.text forKey:@"text"];
[managedObjectContext insertObject:object];
// Commit the change.
NSError *error = nil;
if (![managedObjectContext save:&error]) {
// Handle the error.
}
else{
NSLog(@"Object saved: %@ in %@ and id: %@",aux.text,aux.date,aux.idwarning);
}
}
And loadxcdata:
- (void) loadxcdata
{
[xcdataarray removeAllObjects];
if (managedObjectContext == nil) // generar el contexto del CoreData
{
managedObjectContext = [(EmergencyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Aviso" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
// Execute the fetch -- create a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
NSLog(@"Error al recuperar:%@",error);
}
// Set self's events array to the mutable array, then clean up.
[self setXcdataarray:mutableFetchResults];
for(Aviso * war in xcdataarray)
{
NSLog(@"Core data object: %@ in %@ and id: %@",war.text,war.date,war.idwarning);
}
}
And this is what I am obtaining in my console. Firstly the objects are properly stored but while retrieving them again I am only getting the last one:
2013-04-24 17:50:05.716 Emergencies[4286:907] CoreData: error: Failed to call designated initializer on NSManagedObject class 'Aviso'
2013-04-24 17:50:05.844 Emergencies[4286:907] Object saved: sexto y ultimo in 2013-04-19 12:21:43 +0000 and id: 9
2013-04-24 17:50:05.905 Emergencies[4286:907] Object saved: fifth later in 2013-04-18 11:17:50 +0000 and id: 8
2013-04-24 17:50:05.961 Emergencies[4286:907] Object saved: fifth in 2013-04-18 11:17:44 +0000 and id: 7
2013-04-24 17:50:06.014 Emergencies[4286:907] Object saved: forth later in 2013-04-18 11:11:57 +0000 and id: 6
2013-04-24 17:50:06.071 Emergencies[4286:907] Object saved: cuarto in 2013-04-18 11:11:36 +0000 and id: 5
2013-04-24 17:50:06.128 Emergencies[4286:907] Object saved: tercero in 2013-04-18 10:25:01 +0000 and id: 3
2013-04-24 17:50:06.183 Emergencies[4286:907] Object saved: in 2013-04-18 10:57:27 +0000 and id: 4
2013-04-24 17:50:06.237 Emergencies[4286:907] Object saved: rt in 2013-04-18 10:20:20 +0000 and id: 2
2013-04-24 17:50:06.296 Emergencies[4286:907] Object saved: This is the first example in 2013-04-17 08:43:45 +0000 and id: 1
2013-04-24 17:50:06.304 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.306 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.308 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.310 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.312 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.314 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.317 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.319 Emergencies[4286:907] Core data object: (null) in (null) and id: (null)
2013-04-24 17:50:06.321 Emergencies[4286:907] Core data object: This is the first example in 2013-04-17 08:43:45 +0000 and id: 1
EDIT:
After I created a new class Aviso
from the Core Data Entity (Select the Entity and then Editor - Create new NSManagedObject
and then modify couple of lines in my saveObjectcdata
method and now it works.
-(void) saveObjectcdata:(NSString *)warningId date:(NSDate*)date text:(NSString*)txt
{
Aviso *object = [NSEntityDescription insertNewObjectForEntityForName:@"Aviso" inManagedObjectContext:self.managedObjectContext];
object.idwarning = warningId;
object.date = date;
object.text = txt;
// Commit the change.
NSError *error = nil;
if (![managedObjectContext save:&error]) {
// Handle the error.
}
else{
NSLog(@"Object saved: %@ in %@ and id: %@",object.text,object.date,object.idwarning);
}
}
I understand why you get the null values, I do not understand why the last object is save successfully.
You not working with CoreData the way it was designed to operate.
1) You don't have to implement the internal data structure of the entity. if you like a class to represent your entity, select your entity in the designed and select: Editor->Create NSManagedObject Subclass.
No need to add anything unless you require additional functionality.
Do not override what should not be overidden see here for more details.
2) You are adding the new objects the wrong way.
To insert an item you should only call: [NSEntityDescription insertNewObjectForEntityForName:<EntityName> inManagedObjectContext:<context>]
.
You can cast the result to your desired managed object subclass.
Your saveObjectdata:
should look something like:
-(void) saveObjectcdata:(id)warningId date:(NSDate*)date text:(NSString*)text
{
Avisio *object = [NSEntityDescription insertNewObjectForEntityForName:@"Aviso" inManagedObjectContext:self.managedObjectContext];
object.idwarning = warningId;
object.date = date;
object.text = text;
// Commit the change.
NSError *error = nil;
if (![managedObjectContext save:&error]) {
// Handle the error.
}
else{
NSLog(@"Object saved: %@ in %@ and id: %@",object.text,object.date,object.idwarning);
}
}
3) I suggest you read this to get the hand of things