Проблем с CoreData и връзката на обекта

В моя основен модел на данни имам два обекта:

  1. InventoryItem
  2. InventoryAction

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