2013-12-03 2 views
0

У меня есть 2 объекта с драйвером и Work_Shift. Драйвер имеет отношение один к другому с Work_Shift и Work_SHift имеет отношение один к одному с драйвером.Отношение данных сердечника, возвращающее значение

Я пытаюсь получить деталь драйвера при извлечении данных Work_shift, но я получаю пустые значения.

Вот мой код:

Это код для извлечения Work_Shift детали вместе с отношения внутри нее.

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Work_Shift"]; 

    //[fetch setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObject:@"work_shifts.id"]]; 

    fetch.returnsObjectsAsFaults = NO; 

    work_shift_results = [[self managedObjectContext] executeFetchRequest:fetch error:&error]; 

    if([work_shift_results count]>0) 
    { 
     Work_Shift *shift = [work_shift_results objectAtIndex:0]; 
     NSSet *driverSet = shift.work_shifts; 
     NSArray *driverArray = [driverSet allObjects]; 

     NSLog(@"Shift: %@",shift); 
    } 

Это выход я получаю

<Work_Shift: 0x15678540> (entity: Work_Shift; id: 0x15665460 <x-coredata://7059F32C-63F0-4B2C-A104-5FA339AE2473/Work_Shift/p2> ; data: { 
    block = nil; 
    "dest_mine_loc_id" = 0; 
    "driver_id" = 6; 
    "end_date" = nil; 
    weight = 0; 
    "work_shifts" =  (
    ); 
}) 

Я проверил и есть имеют записей в таблице драйвера. Я также пробовал раскомментировать код выше, но я получаю тот же результат.

Субъектами являются

@class Work_Shift; 

@interface Driver : NSManagedObject 

@property (nonatomic, retain) NSString * address; 
@property (nonatomic, retain) NSString * contact_number; 
@property (nonatomic, retain) NSNumber * id; 
@property (nonatomic, retain) NSNumber * is_active; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) Work_Shift *driver; 

@end 

и

@class Driver; 

@interface Work_Shift : NSManagedObject 

@property (nonatomic, retain) NSString * block; 
@property (nonatomic, retain) NSNumber * dest_mine_loc_id; 
@property (nonatomic, retain) NSNumber * driver_id; 
@property (nonatomic, retain) NSDate * end_date; 
@property (nonatomic, retain) NSNumber * excavator_id; 
@property (nonatomic, retain) NSNumber * id; 
@property (nonatomic, retain) NSNumber * material_type_id; 
@property (nonatomic, retain) NSNumber * mine_location_id; 
@property (nonatomic, retain) NSNumber * relative_level_id; 
@property (nonatomic, retain) NSNumber * shift_type_id; 
@property (nonatomic, retain) NSDate * start_date; 
@property (nonatomic, retain) NSNumber * truck_type_id; 
@property (nonatomic, retain) NSNumber * weight; 
@property (nonatomic, retain) NSSet *work_shifts; 
@end 

@interface Work_Shift (CoreDataGeneratedAccessors) 

- (void)addWork_shiftsObject:(Driver *)value; 
- (void)removeWork_shiftsObject:(Driver *)value; 
- (void)addWork_shifts:(NSSet *)values; 
- (void)removeWork_shifts:(NSSet *)values; 

@end 

Я-то отсутствует?

+0

Где код, который связывает Work_shift с драйвером? – J2theC

+0

Я создал объекты, использующие класс NSManagedObject, я не уверен, что здесь ассоциируется ..: | –

+0

Опубликовать данные об отношениях между сущностями. Кажется, вы используете внешний ключ, чтобы связать драйвер с рабочей сменой. Обычно лучше напрямую связывать объекты. Workshift.driver = драйвер. –

ответ

2

Лучше пример, как обещало

Этой модели, показывающие отношения

enter image description here

атрибутов Сущности и отношения enter image description here

enter image description here

Пример код для создания сущности и набора атрибутов и r elationships. Если хотите, я могу отправить вам пример приложения.

- (void)addEntities { 

    Driver *driver1 = (Driver *)[self createNewDriverMethod1:@"Driver 1" address:@"Address 1"]; 
    Driver *driver2 = [self createNewDriverMethod2:@"Driver 2" address:@"Address 2"]; 

    Excavator *excavator1 = [self createNewExcavator:@"EXC001" make:@"CAT" model:@"DX1000"]; 
    Excavator *excavator2 = [self createNewExcavator:@"EXC002" make:@"CAT" model:@"DX2000"]; 

    // Current date as shift start date & time 
    NSDate *shiftStartDate = [NSDate date]; 

    Workshift *workshift1 = [self createNewWorkshift:shiftStartDate hours:8.0 driver:driver1]; 
    workshift1.excavator = excavator1; 


    Workshift *workshift2 = [self createNewWorkshift:shiftStartDate hours:8.0 driver:driver2]; 
    workshift2.excavator = excavator2; 

    NSError *error; 

    if (![[self managedObjectContext] save:&error]) { 
     NSLog(@" error saving data %@, %@", error, error.userInfo); 
    } 

    [self listWorkShifts]; 


} 
- (void)listWorkShifts { 

    NSFetchRequest *req = [[NSFetchRequest alloc] init]; 

    [req setEntity:[NSEntityDescription entityForName:@"Driver" inManagedObjectContext:[self managedObjectContext]]]; 

    NSError *error; 

    NSArray *result = [[self managedObjectContext] executeFetchRequest:req error:&error]; 

    if (result == nil) { 
     NSLog(@" error fetching Driver list %@", error); 
     return; 
    } 

    for (Driver *driver in result) { 
     NSLog(@" Driver: %@", driver.name); 


     for (Workshift *shift in driver.workshifts) { 

      NSLog(@" SHIFT"); 
      NSLog(@"   Start: %@", [shift.startDate description]); // Get date back as string 
      NSLog(@"   End: %@", [shift.endDate description]); // Get date back as string 
      NSLog(@"  Excavator: %@, %@", shift.excavator.make, shift.excavator.model); 
      NSLog(@" "); 

     } 
     NSLog(@" "); 
    } 
} 
- (NSManagedObject *)createNewDriverMethod1:(NSString *)name address:(NSString *)address 
{ 
    NSManagedObject *newDriver = [NSEntityDescription 
            insertNewObjectForEntityForName:@"Driver" 
            inManagedObjectContext:[self managedObjectContext]]; 

    [newDriver setValue:name forKey:@"name"]; 
    [newDriver setValue:address forKey:@"address"]; 

    return newDriver; 
} 

- (Driver *)createNewDriverMethod2:(NSString *)name address:(NSString *)address 
{ 
    Driver *newDriver = [NSEntityDescription 
           insertNewObjectForEntityForName:@"Driver" 
           inManagedObjectContext:[self managedObjectContext]]; 
    newDriver.name = name; 
    newDriver.address = address; 
    return newDriver; 
} 
- (Workshift *)createNewWorkshift:(NSDate *)startDate hours:(float)hours driver:(Driver *)driver 
{ 
    Workshift *newWorkshift = [NSEntityDescription 
         insertNewObjectForEntityForName:@"Workshift" 
         inManagedObjectContext:[self managedObjectContext]]; 

    [newWorkshift setValue:startDate forKey:@"startDate"]; 

    // time interval in seconds 
    NSTimeInterval interval = hours * 60 * 60; 

    NSDate *endDate = [startDate dateByAddingTimeInterval:interval]; 

    [newWorkshift setValue:endDate forKey:@"endDate"]; 
    [newWorkshift setValue:driver forKey:@"driver"]; 

    return newWorkshift; 
} 
- (Excavator *)createNewExcavator:(NSString *)identifier make:(NSString *)make model:(NSString *)model 
{ 
    Excavator *newExcavator = [NSEntityDescription 
           insertNewObjectForEntityForName:@"Excavator" 
           inManagedObjectContext:[self managedObjectContext]]; 

    [newExcavator setValue:identifier forKey:@"identifier"]; 
    [newExcavator setValue:make forKey:@"make"]; 
    [newExcavator setValue:model forKey:@"model"]; 

    return newExcavator; 
} 
+0

Большое вам спасибо :) –

Смежные вопросы