Проблема отношения CoreData и Entity

В моей основной модели данных у меня есть две сущности:

  1. ИнвентарьЭлемент
  2. ИнвентарьДействие

InventoryItem имеет следующие атрибуты:
Атрибуты:

@property (nonatomic, retain) NSNumber * allowsActions;
@property (nonatomic, retain) NSNumber * assetID;
@property (nonatomic, retain) NSNumber * inventoryObjectID;
@property (nonatomic, retain) NSString * objectDescription;
@property (nonatomic, retain) NSNumber * quantity;
@property (nonatomic, retain) NSNumber * retired;
@property (nonatomic, retain) NSString * serialNumber;

Отношения:

@property (nonatomic, retain) NSSet *action;

InventoryAction имеет следующие атрибуты Атрибуты:

@property (nonatomic, retain) NSDate * actionDate;
@property (nonatomic, retain) NSNumber * actionID;
@property (nonatomic, retain) NSString * actionLongValue;
@property (nonatomic, retain) NSString * actionShortValue;
@property (nonatomic, retain) NSString * notes;
@property (nonatomic, retain) NSNumber * userActionID;
@property (nonatomic, retain) NSString * userAuthorizingAction;
@property (nonatomic, retain) NSString * userPerformingAction;
@property (nonatomic, retain) NSNumber * userPerformingActionExt;
@property (nonatomic, retain) NSNumber * inventoryObjectID;

Отношения

@property (nonatomic, retain) InventoryItem *object;

Теперь, когда у вас есть вся эта информация, я скажу вам, что все значения, хранящиеся в модели CoreData, поступают из веб-службы в формате JSON. Все значения сохраняются правильно.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я извлекаю данные из CoreData, он возвращает только уникальные значения.

Например: последний InventoryItem имеет 6 связанных с ним действий:

  1. "",
  2. "",
  3. "выглядит слизистым",
  4. "о боже....зачем тебе делать это с неодушевленным предметом, больной",
  5. "теперь все липкое",
  6. "все выглядит хорошо"

Поскольку 1 и 2 имеют одинаковое значение, он извлекает только значения 1, 3, 4, 5 и 6.

Вот код, который я использую для получения данных:

- (void)loadDetails
{
    _fetchRequest = [[NSFetchRequest alloc] init];
    _entity = [NSEntityDescription entityForName:@"InventoryObject" inManagedObjectContext:[self managedObjectContext]];
    _sort = [NSSortDescriptor sortDescriptorWithKey:@"inventoryObjectID" ascending:YES];
    _sortDescriptors = [[NSArray alloc]initWithObjects:_sort, nil];

    [_fetchRequest setEntity:_entity];
    [_fetchRequest setSortDescriptors:_sortDescriptors];

    NSError *error;
    _fetchedObjects = [[self managedObjectContext] executeFetchRequest:_fetchRequest error:&error];
    for (InventoryItem *inventoryItem in _fetchedObjects) {
        NSLog(@"Object Description: %@", [inventoryItem valueForKey:@"objectDescription"]);
        NSLog(@"Object ID: %@", [inventoryItem valueForKey:@"inventoryObjectID"]);
        InventoryAction *action = (InventoryAction *)inventoryItem.action;
        NSLog(@"Action Long Value: %@", [action valueForKey:@"actionLongValue"]);
        NSLog(@"Notes: %@", [action valueForKey:@"notes"]);

    }
}

Вот возврат JSON:

[{"MediaInventoryObjectsId":1,"AssetId":15,"Quantity":1,"SerialNumber":"R45DFL5","Description":"Test Camera 1","AllowActions":true,"Retired":false,"Actions":[{"MediaInventoryActionsId":3,"MediaInventoryObjectsId":1,"UserPerformingActionExt":4444,"UserActionId":1,"ActionDate":"2014-05-19T15:31:45.6","UserPerformingAction":"myersb","UserAuthorizingAction":"mccroskeyl","Notes":null,"ActionShortValue":"OUT","ActionLongValue":"Check Out"},{"MediaInventoryActionsId":4,"MediaInventoryObjectsId":1,"UserPerformingActionExt":4444,"UserActionId":2,"ActionDate":"2014-05-19T15:31:45.6","UserPerformingAction":"myersb","UserAuthorizingAction":"mccroskeyl","Notes":"everything looks good","ActionShortValue":"IN","ActionLongValue":"Check In"}]},{"MediaInventoryObjectsId":2,"AssetId":15,"Quantity":2,"SerialNumber":"IDKMYBFFJILL","Description":"Vanilla Ice Cream","AllowActions":true,"Retired":false,"Actions":[]},{"MediaInventoryObjectsId":3,"AssetId":15,"Quantity":1,"SerialNumber":"R2D23P0","Description":"Droid Bee Box","AllowActions":true,"Retired":false,"Actions":[{"MediaInventoryActionsId":5,"MediaInventoryObjectsId":3,"UserPerformingActionExt":4444,"UserActionId":1,"ActionDate":"2014-05-20T14:48:29.53","UserPerformingAction":"myersb","UserAuthorizingAction":"mccroskeyl","Notes":null,"ActionShortValue":"OUT","ActionLongValue":"Check Out"},{"MediaInventoryActionsId":6,"MediaInventoryObjectsId":3,"UserPerformingActionExt":4444,"UserActionId":2,"ActionDate":"2014-05-20T14:48:29.58","UserPerformingAction":"myersb","UserAuthorizingAction":"mccroskeyl","Notes":"everything looks good","ActionShortValue":"IN","ActionLongValue":"Check In"},{"MediaInventoryActionsId":7,"MediaInventoryObjectsId":3,"UserPerformingActionExt":5555,"UserActionId":1,"ActionDate":"2014-05-20T14:48:29.6","UserPerformingAction":"farmer","UserAuthorizingAction":"mccroskeyl","Notes":null,"ActionShortValue":"OUT","ActionLongValue":"Check Out"},{"MediaInventoryActionsId":8,"MediaInventoryObjectsId":3,"UserPerformingActionExt":5555,"UserActionId":2,"ActionDate":"2014-05-20T14:48:29.6","UserPerformingAction":"farmer","UserAuthorizingAction":"mccroskeyl","Notes":"its all slimy now","ActionShortValue":"IN","ActionLongValue":"Check In"},{"MediaInventoryActionsId":9,"MediaInventoryObjectsId":3,"UserPerformingActionExt":6666,"UserActionId":1,"ActionDate":"2014-05-20T14:48:29.61","UserPerformingAction":"intern1","UserAuthorizingAction":"mccroskeyl","Notes":"it looks kinda slimy","ActionShortValue":"OUT","ActionLongValue":"Check Out"},{"MediaInventoryActionsId":10,"MediaInventoryObjectsId":3,"UserPerformingActionExt":6666,"UserActionId":2,"ActionDate":"2014-05-20T14:48:29.62","UserPerformingAction":"intern1","UserAuthorizingAction":"mccroskeyl","Notes":"oh god....why would you do that to an inanimate object you sicko","ActionShortValue":"IN","ActionLongValue":"Check In"}]}]

Я где-то читал, что NSSet, возможно, возвращает только уникальные записи. Верно ли это, и если да, то каким будет решение, поскольку отношение: действие является NSSet?


person bnjmn.myers    schedule 23.05.2014    source источник


Ответы (1)


Ваши отношения объявляются так:

@property (nonatomic, retain) NSSet *action;

Но вы получаете к нему доступ следующим образом:

InventoryAction *action = (InventoryAction *)inventoryItem.action;

Это неправильно. Отношение action представляет собой отношение NSSet, содержащее экземпляры отношения InventoryAction, а не само отношение InventoryAction. Несмотря на то, что вы назначаете это InventoryAction *, на самом деле у вас есть NSSet. Затем вы делаете это:

NSLog(@"Notes: %@", [action valueForKey:@"notes"]);

Если вы вызываете valueForKey: для NSSet, он возвращает все уникальные значения этого ключа для объектов в наборе. В этом случае он возвращает все уникальные значения атрибута notes для объектов InventoryAction в наборе, что вы и видите. Если вы хотите найти каждый экземпляр вместо каждого уникального значения, вам нужно что-то вроде:

NSSet *actions = inventoryItem.action;
for (InventoryAction *action in actions) {
    NSLog(@"Action note: %@", action.note);
}

[Предупреждение, приведенное выше просто введено в мой веб-браузер....]

person Tom Harrington    schedule 23.05.2014