Coto
Coto

Reputation: 5

Core Data Duplicate Entity

I`m new with Core Data and I face some problems with Many-To-Many relationships,

Here is my structure

Diagrams

This structure allow that 1 Profile can have many itens and 1 Item can be in many Profiles It`s like a Store

Both relations is Inverse

So when I`m add a new Item in Profile, the new Item was duplicate in my table Item.

ITENS LIST
========== 
ITEM9
ITEM50
==========

after add a new Item in Profile

ITENS LIST
==========
ITEM9
ITEM50
ITEM9
==========

When I list my profile "itens" is correct just 1 new Item.

PROFILE 
========== 
ITEM9 
==========

My code for this operations is.

MocManager* moc = [MocManager sharedMocManager];
NSArray* products = [moc listData:@"products"];
NSMutableString* desc = [NSMutableString string];

if( products != nil ) {
    Item* itemToBuy = products[0]; // This is just a test. get the first
    Item* newItem = [Item initItem];

    NSEntityDescription *entity = [itemToBuy entity];
    for (NSString *attributeName in [entity attributesByName]) {
        [newItem setValue:[itemToBuy valueForKey:attributeName] forKey:attributeName];
    }
    for (NSString *relationshipName in [entity relationshipsByName]) {
        [newItem setValue:[itemToBuy valueForKey:relationshipName] forKey:relationshipName];
    }


    [desc appendString:newItem.identifier];

    [profile addItensObject:newItem];

    [moc saveData];
}

My question is.

Tks

Brunno

Upvotes: 1

Views: 756

Answers (1)

Teripaquitinho
Teripaquitinho

Reputation: 13

here's my way to check duplicates:

ENTITY* obj = nil;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"ENTITY"];
request.predicate = [NSPredicate predicateWithFormat:@"ENTITY.ID = %@", NEW_ELEMENT_ID];

NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];

if (!matches || ([matches count] > 1)) {
    //NSLog(@"Error, YOU HAVE MORE THAN ONE OBJECT WITH SAME ID");
} else if ([matches count] == 0) {
    //NSLog(@"NEW, OBJ NOT FOUND WITH THAT ID");
    obj = [NSEntityDescription insertNewObjectForEntityForName:@"ENTITY" inManagedObjectContext:YOUR_CONTEXT];
} else {
    obj = [matches lastObject]; //only one obj found... update this one
}

return obj;

Upvotes: 1

Related Questions